@@ -90,35 +90,94 @@ Server discovery
9090Resolving server names
9191~~~~~~~~~~~~~~~~~~~~~~
9292
93- Each matrix homeserver is identified by a server name consisting of a hostname
93+ Each Matrix homeserver is identified by a server name consisting of a hostname
9494and an optional port, as described by the `grammar
95- <../appendices.html#server-name> `_. Server names should be resolved to an IP
96- address and port using the following process:
97-
98- * If the hostname is an IP literal, then that IP address should be used,
99- together with the given port number, or 8448 if no port is given.
100-
101- * Otherwise, if the port is present, then an IP address is discovered by
102- looking up an AAAA or A record for the hostname, and the specified port is
103- used.
104-
105- * If the hostname is not an IP literal and no port is given, the server is
106- discovered by first looking up a ``_matrix._tcp `` SRV record for the
107- hostname, which may give a hostname (to be looked up using AAAA or A queries)
108- and port. If the SRV record does not exist, then the server is discovered by
109- looking up an AAAA or A record on the hostname and taking the default
110- fallback port number of 8448.
111-
112- Homeservers may use SRV records to load balance requests between multiple TLS
113- endpoints or to failover to another endpoint if an endpoint fails.
114-
115- When making requests to servers, use the hostname of the target server in the
116- ``Host `` header, regardless of any hostname given in the SRV record. For
117- example, if the server name is ``example.org ``, and the SRV record resolves to
118- ``matrix.example.org ``, the ``Host `` header in the request should be
119- ``example.org ``. If an explicit port was given in the server name, it should be
120- included in the ``Host `` header; otherwise, no port number should be given in
121- the ``Host `` header.
95+ <../appendices.html#server-name> `_. Where applicable, a delegated server name
96+ uses the same grammar.
97+
98+ Server names are resolved to an IP address and port to connect to, and have
99+ various conditions affecting which certificates and ``Host `` headers to send.
100+ The process overall is as follows:
101+
102+ .. Note from the author: The repetitive "use this Host header and this cert"
103+ comments are intentional. The process is overall quite complicated, and
104+ explaining explicitly what requests look like at each step helps ease the
105+ understanding and ensure everyone is on the same page. Implementations
106+ are of course welcome to realize where the process can be optimized, and
107+ do so - just ensure that the result is the same!
108+
109+ 1. If the hostname is an IP literal, then that IP address should be used,
110+ together with the given port number, or 8448 if no port is given. A
111+ valid TLS certificate must be provided by the target server for the
112+ IP address on all requests. Requests must be made with a ``Host ``
113+ header containing the IP address, without port.
114+
115+ 2. If the hostname is not an IP literal, a server is found by resolving
116+ an SRV record for ``_matrix._tcp.<hostname> ``. This may result in
117+ a hostname (to be resolved using AAAA or A records) and port. Requests
118+ are made to the resolved IP address and port, using 8448 as a default
119+ port, with a ``Host `` header of ``<hostname> ``. A valid TLS certificate
120+ for ``<hostname> `` must be provided by the target server on all requests.
121+
122+ 3. If the SRV record yielded no results, a ``/.well-known `` request is
123+ made to the hostname (using port 443 exclusively, ignoring the port
124+ provided in the server name). The target must present a valid TLS
125+ certificate for the hostname, and a ``Host `` header containing the
126+ hostname is used to make the request. The schema of the ``/.well-known ``
127+ request is later in this section. Assuming the response is valid,
128+ the ``m.server `` property is parsed as ``<delegated_server_name>[:<delegated_port>] ``
129+ and processed as follows:
130+
131+ * If ``<delegated_server_name> `` is an IP literal, then that IP address
132+ should be used together with the ``<delegated_port> `` or 8448 if no
133+ port is provided. A valid TLS certificate must be provided by the
134+ target server for that IP address. Requests must be made with a
135+ ``Host `` header containing the IP address, without port.
136+
137+ * If ``<delegated_server_name> `` is not an IP literal, and ``<delegated_port> ``
138+ is present, an IP address is disovered by looking up an AAAA or A
139+ record for ``<delegated_server_name> ``. The resulting IP address is
140+ used, alongside the ``<delegated_port> ``, to make requests with a
141+ ``Host `` header of ``<delegated_server_name> ``. A valid TLS certificate
142+ must be provided by the target server for ``<delegated_server_name> ``.
143+
144+ * If ``<delegated_server_name> `` is not an IP literal and no
145+ ``<delegated_port> `` is present, an SRV record is looked up for
146+ ``_matrix._tcp.<delegated_server_name> ``. This may result in another
147+ hostname (to be resolved using AAAA or A records) and port. Requests
148+ should be made to the resolved IP address and port with a ``Host ``
149+ header containing the ``<delegated_server_name> ``. Additionally, a
150+ valid TLS certificate must be provided by the target server for the
151+ ``<delegated_server_name> ``.
152+
153+ * If no SRV record is found, an IP address is resolved using AAAA
154+ or A records. Requests are then made to the resolve IP address
155+ and a port of 8448, using a ``Host `` header of ``<delegated_server_name> ``.
156+ A valid TLS certificate for ``<delegated_server_name> `` must be
157+ provided by the target server.
158+
159+ 4. If the `/.well-known ` request was invalid or returned an error response,
160+ and the SRV record was not found, an IP address is resolved using AAAA
161+ and A records. Requests are made to the resolved IP address using port
162+ 8448 and a ``Host `` header containing the ``<hostname> ``. A valid TLS
163+ certificate for ``<hostname> `` must be provided by the target server
164+ on all requests.
165+
166+
167+ The TLS certificate provided by the target server must be present on all
168+ requests made to the server. The TLS certificate must be signed by a known
169+ Certificate Authority. Servers are ultimately responsible for determining
170+ the trusted Certificate Authorities, however are strongly encouraged to
171+ rely on the operating system's judgement. Servers can offer administrators
172+ a means to override the trusted authorities list. Servers can additionally
173+ skip the certificate validation for a given whitelist of domains or netmasks
174+ for the purposes of testing or in networks where verification is done
175+ elsewhere, such as with ``.onion `` addresses.
176+
177+ Servers are encouraged to make use of the
178+ `Certificate Transparency <https://www.certificate-transparency.org/ >`_ project.
179+
180+ {{wellknown_ss_http_api}}
122181
123182Server implementation
124183~~~~~~~~~~~~~~~~~~~~~~
@@ -130,9 +189,16 @@ Retrieving server keys
130189
131190.. NOTE ::
132191 There was once a "version 1" of the key exchange. It has been removed from the
133- specification due to lack of significance. It may be reviewed `here
192+ specification due to lack of significance. It may be reviewed `from the historical draft
134193 <https://github.com/matrix-org/matrix-doc/blob/51faf8ed2e4a63d4cfd6d23183698ed169956cc0/specification/server_server_api.rst#232version-1> `_.
135194
195+ .. NOTE ::
196+ Older drafts of this specification made use of a different style of key verification,
197+ however for reasons discussed in `MSC1711 <https://github.com/matrix-org/matrix-doc/pull/1711 >`_,
198+ the approach was removed from the initial version of the specification. The older
199+ draft may be reviewed `thanks to web.archive.org
200+ <https://web.archive.org/web/20181019044236/https://matrix.org/docs/spec/server_server/unstable.html> `_.
201+
136202Each homeserver publishes its public keys under ``/_matrix/key/v2/server/{keyId} ``.
137203Homeservers query for keys by either getting ``/_matrix/key/v2/server/{keyId} ``
138204directly or by querying an intermediate notary server using a
0 commit comments