Hi,
I figured it would be better to send an email, rather than proposing and 
discussing this on a PR (proposed edits/diffs are at the bottom of this email).
We have two suggestions regarding the specification text 
(https://datatracker.ietf.org/doc/draft-ietf-tls-esni/):
Suggestion 1
Make it clear that if an ECH extension is absent from the server_hello, it 
qualifies as an ECH disabling signal. The text earlier in the section already 
requires that "both authentication and the handshake complete successfully" in 
the initial ECH-enabled connection, for ECH to be regarded as disabled. The 
same (ECH disabling due to absent ECH ext from server) can be deducted by 
reading a few paragraphs, but even then, it is not clear. This makes it much 
clearer.
In Section 6.1.6, change:
If none of the values provided in "retry_configs" contains a supported version,
or an earlier TLS version was negotiated, the client can regard ECH as securely
disabled by the server, and it SHOULD retry the handshake with a new transport
connection and ECH disabled.
To:
If none of the values provided in "retry_configs" contains a supported version,
or an earlier TLS version was negotiated, or the server did not supply an
"encrypted_client_hello" extension in its EncryptedExtensions message, the
client can regard ECH as securely disabled by the server. It SHOULD retry
the handshake with a new transport connection and ECH disabled.
Suggestion 2
Section 6.1.6 also mentions that:
Clients SHOULD implement a limit on retries caused by receipt of "retry_configs"
or servers which do not acknowledge the "encrypted_client_hello" extension.
The text does not differentiate between retry types for the purpose of limiting 
the connections. I.e., if the ECH config was replaced, then it is an 
ECH-enabled retry (with new keys). But if ECH was disabled, then it is an 
ECH-disabled retry. Limiting the connections makes sense for ECH-enabled 
retries due to config replacement, since the connections seem not be successful 
in any case and thus the extra load is not necessary. But limiting it for 
ECH-disabled connections could mean that connections may start failing 
abruptly, depending on the aggressiveness of the limit on the client. As long 
as ECH-disabled connections succeed, they should not be limited so that 
connectivity does not suffer unnecessarily.
It would probably even be good/necessary to implement a holdoff on the client 
in the ECH-disabled case. I.e., not making an ECH-enabled connection to an SNI 
that resulted in ECH disabling for some duration of time. Some scenarios where 
this would be desirable:

  *   The ECH version steps. This will lead to ECH-disabled retries. During DNS 
propagation time, the number of connections to client-facing servers of ECH 
enabled sites will double (say a large CDN activates a version step of all its 
sites all at once). Clients that limit retries could experience connectivity 
issues, but clients that implement a holdoff would mitigate the connection 
doubling problem in such a scenario.
  *   A server disables ECH temporarily or serves TLS 1.2. Again, ECH will be 
securely disabled, and a connectivity loss may occur (retry limit). A doubling 
in connections will be experienced until DNS propagation is finished - or 
indefinitely in case of a config issue (e.g. server administrator does not 
remove ECH config from DNS).
  *   Section 8.2 talks about middleboxes acting as TLS-terminating proxies. 
All connections going through such proxies will result in ECH being disabled 
(due to the ECH extension being absent from the server_hello). Also leading to 
a possible connectivity loss, or at the very least a permanent doubling in 
connections.
The "connection doubling" in the scenarios above increases connection 
establishment latency and adds load to the client, server, middlebox, and other 
stateful network devices, and can be mitigated by a temporary holdoff on 
ECH-enabled connections on the client.
The proposal is therefore to change Section 6.1.6 from:
If none of the values provided in "retry_configs" contains a supported version,
or an earlier TLS version was negotiated, the client can regard ECH as securely
disabled by the server, and it SHOULD retry the handshake with a new transport
connection and ECH disabled.

Clients SHOULD implement a limit on retries caused by receipt of "retry_configs"
or servers which do not acknowledge the "encrypted_client_hello" extension. If
the client does not retry in either scenario, it MUST report an error to the
calling application.
To:
Clients SHOULD implement a limit on ECH-enabled retries caused by the secure
replacement of ECH keys by "retry_configs". If the client does not retry, it
MUST report an error to the calling application.

If none of the values provided in "retry_configs" contains a supported version,
or an earlier TLS version was negotiated, or the server did not supply an
"encrypted_client_hello" extension in its EncryptedExtensions message, the
client can regard ECH as securely disabled by the server. It SHOULD retry
the handshake with a new transport connection and ECH disabled. If the client
does not retry, it MUST report an error to the calling application.

Clients SHOULD implement a holdoff on ECH-enabled connections to an SNI for
which ECH has been securely disabled. I.e., those connections made after the
ECH-disabled retry. Clients SHOULD still send a GREASE ECH extension (see
{{grease-ech}}) for ECH-disabled connections made during the holdoff period.

Thanks,
Elardus
(suggested diffs to the specification below)
@@ -852,10 +852,11 @@ If the server supplied an "encrypted_client_hello" 
extension in its
EncryptedExtensions message, the client MUST check that it is syntactically
valid and the client MUST abort the connection with a "decode_error" alert
otherwise. If an earlier TLS version was negotiated, the client MUST NOT enable
-the False Start optimization {{RFC7918}} for this handshake. If both
-authentication and the handshake complete successfully, the client MUST perform
-the processing described below then abort the connection with an "ech_required"
-alert before sending any application data to the server.
+the False Start optimization {{RFC7918}} for this handshake.
+
+If both authentication and the handshake complete successfully, the client MUST
+perform the processing described below then abort the connection with an
+"ech_required" alert before sending any application data to the server.
 If the server provided "retry_configs" and if at least one of the values
contains a version supported by the client, the client can regard the ECH keys
@@ -876,15 +877,21 @@ because the client will send cookies to the server in 
parallel connections,
using the retry configurations for these parallel connections does not
introduce a new tracking vector.
+Clients SHOULD implement a limit on ECH-enabled retries caused by the secure
+replacement of ECH keys by "retry_configs". If the client does not retry, it
+MUST report an error to the calling application.
+
If none of the values provided in "retry_configs" contains a supported version,
-or an earlier TLS version was negotiated, the client can regard ECH as securely
-disabled by the server, and it SHOULD retry the handshake with a new transport
-connection and ECH disabled.
-
-Clients SHOULD implement a limit on retries caused by receipt of 
"retry_configs"
-or servers which do not acknowledge the "encrypted_client_hello" extension. If
-the client does not retry in either scenario, it MUST report an error to the
-calling application.
+or an earlier TLS version was negotiated, or the server did not supply an
+"encrypted_client_hello" extension in its EncryptedExtensions message, the
+client can regard ECH as securely disabled by the server. It SHOULD retry
+the handshake with a new transport connection and ECH disabled. If the client
+does not retry, it MUST report an error to the calling application.
+
+Clients SHOULD implement a holdoff on ECH-enabled connections to an SNI for
+which ECH has been securely disabled. I.e., those connections made after the
+ECH-disabled retry. Clients SHOULD still send a GREASE ECH extension (see
+{{grease-ech}}) for ECH-disabled connections made during the holdoff period.
 ### Authenticating for the Public Name {#auth-public-name}


_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to