[TLS] ECH and resumption - what to put in SNI?

2021-06-25 Thread Stephen Farrell


Hiya,

If a client established a session to foo.example.com
using ECH with a public_name of example.com, what ought
the client put in the SNI when resuming?

Ignoring ECH, 8446 seems to imply one ought put in
foo.example.com [1] but that'd defeat the purpose of
ECH.

If one omits SNI, that would likely be hard to handle
for a client-facing server when it tries to route
to a good split-mode backend. The same could be true
even if example.com is included as the SNI.

I guess the client could do ECH again, but that'd also
be odd, as it'd require asymmetric crypto when resuming
(which I guess is a lot of the point of tickets), and
depending on ticket ages vs. ECHConfig key rotation
times, might cause interesting failures for a library
client that can't do fresh DNS queries from within the
library (and might never see the TTL of the HTTPS/SVCB
RR in any case).

Am I missing something obvious? If not, what's best here?
(And we should probably have some text in the draft on
this too.)

Cheers,
S.

PS: I guess if the inner and outer ALPNs differed in
the original CH, similar issues might arise for a
client-facing server, in terms of figuring out the
right backend to which the resumed session should be
routed, if routing were based on e.g. the inner ALPN.




[1] https://datatracker.ietf.org/doc/html/rfc8446#page-57


OpenPGP_0x5AB2FAF17B172BEA.asc
Description: OpenPGP public key


OpenPGP_signature
Description: OpenPGP digital signature
___
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls


Re: [TLS] ECH and resumption - what to put in SNI?

2021-06-25 Thread Eric Rescorla
On Fri, Jun 25, 2021 at 7:21 AM Stephen Farrell 
wrote:

>
> Hiya,
>
> If a client established a session to foo.example.com
> using ECH with a public_name of example.com, what ought
> the client put in the SNI when resuming?
>
> Ignoring ECH, 8446 seems to imply one ought put in
> foo.example.com [1] but that'd defeat the purpose of
> ECH.
>

> If one omits SNI, that would likely be hard to handle
> for a client-facing server when it tries to route
> to a good split-mode backend. The same could be true
> even if example.com is included as the SNI.
>

> I guess the client could do ECH again, but that'd also
> be odd, as it'd require asymmetric crypto when resuming
> (which I guess is a lot of the point of tickets), and
> depending on ticket ages vs. ECHConfig key rotation
> times, might cause interesting failures for a library
> client that can't do fresh DNS queries from within the
> library (and might never see the TTL of the HTTPS/SVCB
> RR in any case).
>

TLS session resumption is soft state, so I believe the correct response
here is to send ECH. Otherwise, the server cannot properly respond
if it is not willing to accept the ticket.

The only real alternative here is to have some way for the server
to indicate that it has forgotten the ticket and the client needs to
do a full handshake and *now* do ECH. But of course, that's
not something that's currently specified and isn't really a great
fit for anything in the protocol, though I guess HRR is closest.

-Ekr


> Am I missing something obvious? If not, what's best here?
> (And we should probably have some text in the draft on
> this too.)
>
> Cheers,
> S.
>
> PS: I guess if the inner and outer ALPNs differed in
> the original CH, similar issues might arise for a
> client-facing server, in terms of figuring out the
> right backend to which the resumed session should be
> routed, if routing were based on e.g. the inner ALPN.
>
>
>
>
> [1] https://datatracker.ietf.org/doc/html/rfc8446#page-57
> ___
> TLS mailing list
> TLS@ietf.org
> https://www.ietf.org/mailman/listinfo/tls
>
___
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls


Re: [TLS] ECH and resumption - what to put in SNI?

2021-06-25 Thread David Benjamin
In addition to needing to send ECH in case the server declines resumption,
we need to keep the ticket under encryption anyway. Without changing how
resumption works, there are a couple of attacks on cleartext tickets:

1. If the tickets from two backend servers are distinguishable from each
other, a cleartext ticket will tell you which backend server it was. This
isn't that implausible as ticket formats often start with a "key name" to
handle ticket rotations (RFC5077 even recommended this), and different
backend servers will use different key names if they don't intentionally
coordinate them.

2. Even if the backend servers have aligned their tickets, an attacker can
still check if the server believes a ticket is resumable with a server name
by sending a non-ECH ClientHello, copying the ticket, making up a fake
binder, and seeing if the server noticed the binder was bad. (Bad binders
are fatal to the connection, but the server only checks a binder once it's
decided to resume with a ticket.) This allows an attacker to confirm a
guess about the server name, up to ticket scope granularity.

Always sending ECH avoids both of these.

This is also the simplest answer and aligns with how we've done everything
else in TLS. The client always offers everything it accepts and allows for
resumption to miss. Resumption may miss for reasons other than key
rotation. Suppose the server changed its version or cipher suite
preferences. That would impact which tickets it accepts. Plus RFC8446
requires that the client resume with the same SNI value, and we have
draft-ietf-tls-cross-sni-resumption as a WG item. Making SNI implicit from
resumption would require revisiting all of that.

I don't follow the concern about clients that can't do fresh DNS queries.
There are two possibilities for any given layer of the system that sets up
TLS:

1. Either this layer knows how to set up TLS, but doesn't know how to
establish connections. Low-level TLS APIs look like this. This layer must
take both the transport connection and ECHConfigList as an external
parameter. Resumption works orthogonally: the layers above run through the
same connection establishment procedure independent of resumption, so you
won't have any more stale of ECHConfigList for resumption as full
handshake. If this layer doesn't know how to establish connections for full
handshakes, it doesn't know how to do it for resumption handshakes either.

2. Or this layer knows how to establish a connection *and* set up TLS.
Maybe this is a higher-level TLS API. Maybe this is the
MakeHTTPSConnection() portion of your HTTP stack. In this case, the layer
is responsible for DNS lookup, evaluating HTTPS/SVCB queries, and using the
ECHConfigList. Resumption is equally orthogonal: whenever you make a
connection, you do the DNS lookup, possibly using a cached record. Then you
check your session cache. Use ECH if you have an ECHConfigList. Offer
resumption if you have a session. Do both if you have both.

In both cases, resumption doesn't affect ECHConfigList availability.

On Fri, Jun 25, 2021 at 10:39 AM Eric Rescorla  wrote:

>
>
> On Fri, Jun 25, 2021 at 7:21 AM Stephen Farrell 
> wrote:
>
>>
>> Hiya,
>>
>> If a client established a session to foo.example.com
>> using ECH with a public_name of example.com, what ought
>> the client put in the SNI when resuming?
>>
>> Ignoring ECH, 8446 seems to imply one ought put in
>> foo.example.com [1] but that'd defeat the purpose of
>> ECH.
>>
>
>> If one omits SNI, that would likely be hard to handle
>> for a client-facing server when it tries to route
>> to a good split-mode backend. The same could be true
>> even if example.com is included as the SNI.
>>
>
>> I guess the client could do ECH again, but that'd also
>> be odd, as it'd require asymmetric crypto when resuming
>> (which I guess is a lot of the point of tickets), and
>> depending on ticket ages vs. ECHConfig key rotation
>> times, might cause interesting failures for a library
>> client that can't do fresh DNS queries from within the
>> library (and might never see the TTL of the HTTPS/SVCB
>> RR in any case).
>>
>
> TLS session resumption is soft state, so I believe the correct response
> here is to send ECH. Otherwise, the server cannot properly respond
> if it is not willing to accept the ticket.
>
> The only real alternative here is to have some way for the server
> to indicate that it has forgotten the ticket and the client needs to
> do a full handshake and *now* do ECH. But of course, that's
> not something that's currently specified and isn't really a great
> fit for anything in the protocol, though I guess HRR is closest.
>
> -Ekr
>
>
>> Am I missing something obvious? If not, what's best here?
>> (And we should probably have some text in the draft on
>> this too.)
>>
>> Cheers,
>> S.
>>
>> PS: I guess if the inner and outer ALPNs differed in
>> the original CH, similar issues might arise for a
>> client-facing server, in terms of figuring out the
>> right backend to whi

Re: [TLS] ECH and resumption - what to put in SNI?

2021-06-25 Thread Stephen Farrell


So I guess we're landing on "if the client got a ticket via
a session that successfully used ECH, it MUST send a fresh
ECH when using that ticket"? That's ok I guess, but maybe
some more detail is needed...

On 25/06/2021 17:01, David Benjamin wrote:

1. Either this layer knows how to set up TLS, but doesn't know how to
establish connections. Low-level TLS APIs look like this. This layer must
take both the transport connection and ECHConfigList as an external
parameter. Resumption works orthogonally: the layers above run through the
same connection establishment procedure independent of resumption, so you
won't have any more stale of ECHConfigList for resumption as full
handshake. If this layer doesn't know how to establish connections for full
handshakes, it doesn't know how to do it for resumption handshakes either.

2. Or this layer knows how to establish a connection*and*  set up TLS.
Maybe this is a higher-level TLS API. Maybe this is the
MakeHTTPSConnection() portion of your HTTP stack. In this case, the layer
is responsible for DNS lookup, evaluating HTTPS/SVCB queries, and using the
ECHConfigList. Resumption is equally orthogonal: whenever you make a
connection, you do the DNS lookup, possibly using a cached record. Then you
check your session cache. Use ECH if you have an ECHConfigList. Offer
resumption if you have a session. Do both if you have both.

In both cases, resumption doesn't affect ECHConfigList availability.


I'm not sure yet that OpenSSL matches either 1 or 2, (I've
only done some basic tests) but in any case it seems like
the client could have a ticket cached but get an entirely
different SVCB RR with a different public_name the 2nd time
so I'm not sure that things work well in all cases.

S.


OpenPGP_0x5AB2FAF17B172BEA.asc
Description: OpenPGP public key


OpenPGP_signature
Description: OpenPGP digital signature
___
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls


Re: [TLS] ECH and resumption - what to put in SNI?

2021-06-25 Thread David Benjamin
On Fri, Jun 25, 2021 at 8:45 PM Stephen Farrell 
wrote:

>
> So I guess we're landing on "if the client got a ticket via
> a session that successfully used ECH, it MUST send a fresh
> ECH when using that ticket"? That's ok I guess, but maybe
> some more detail is needed...
>
> On 25/06/2021 17:01, David Benjamin wrote:
> > 1. Either this layer knows how to set up TLS, but doesn't know how to
> > establish connections. Low-level TLS APIs look like this. This layer must
> > take both the transport connection and ECHConfigList as an external
> > parameter. Resumption works orthogonally: the layers above run through
> the
> > same connection establishment procedure independent of resumption, so you
> > won't have any more stale of ECHConfigList for resumption as full
> > handshake. If this layer doesn't know how to establish connections for
> full
> > handshakes, it doesn't know how to do it for resumption handshakes
> either.
> >
> > 2. Or this layer knows how to establish a connection*and*  set up TLS.
> > Maybe this is a higher-level TLS API. Maybe this is the
> > MakeHTTPSConnection() portion of your HTTP stack. In this case, the layer
> > is responsible for DNS lookup, evaluating HTTPS/SVCB queries, and using
> the
> > ECHConfigList. Resumption is equally orthogonal: whenever you make a
> > connection, you do the DNS lookup, possibly using a cached record. Then
> you
> > check your session cache. Use ECH if you have an ECHConfigList. Offer
> > resumption if you have a session. Do both if you have both.
> >
> > In both cases, resumption doesn't affect ECHConfigList availability.
>
> I'm not sure yet that OpenSSL matches either 1 or 2, (I've
> only done some basic tests) but in any case it seems like
> the client could have a ticket cached but get an entirely
> different SVCB RR with a different public_name the 2nd time
> so I'm not sure that things work well in all cases.
>

The main uses of OpenSSL are (1). TLS stacks typically will be (1) because
connection establishment has all kinds of application-specific bits. E.g.
connection establishment in general needs to integrate with proxy logic for
HTTP CONNECT proxies, and interpreting the HTTPS/SVCB record needs to
integrate with Alt-Svc, and deciding between TCP and QUIC.

There's some stuff that's partially shaped like (2) with connect BIOs and
such, but most applications don't use it. I've not thought very hard about
how an HTTPS/SVCB embedding of that API would look like. But either way,
the point about resumption being orthogonal stands.

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