- From: Eric Rescorla <ekr@rtfm.com>
- Date: Tue, 23 Sep 2014 05:23:09 -0700
- To: Roland Zink <roland@zinks.de>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CABcZeBO7YpFjFyjoT8EAqpn6872X_5680ssPmixjypwU+Kp55w@mail.gmail.com>
On Tue, Sep 23, 2014 at 4:02 AM, Roland Zink <roland@zinks.de> wrote: > On 23.09.2014 10:30, Eric Rescorla wrote: > > > On Mon, Sep 22, 2014 at 7:10 PM, Greg Wilkins <gregw@intalio.com> wrote: > >> Patrick, >> >> The reality is that many h2 implementations will not have access to >> their TLS layer in any meaningful way other than getting either a list of >> available cipher names or the name of the selected cipher. It does not >> help us to deny that reality. >> >> A server receives an array of ciphers from the client, let's say they >> are well ordered so the h2 acceptable ones are at the front and the >> unacceptable ones are at the end. The server does not know where in that >> list the browser has decided to make the break, so I can't just >> mechanically remove the ciphers that my deployment thinks are unacceptable >> and then select element [0]. >> (suggestion 1 - send separate cipher arrays for each protocol) >> >> I have to re-evaluate each cipher myself to test if it is h2 acceptable >> and I have to do so in a way that will always produce the same answers as >> the client used, else I fail to connect. (suggestion 2 - define a retry >> mechanism without unacceptable ciphers instead of just failing). >> >> I may not have access to the local TLS implementation, so generally at >> best all I have is the cipher name. Sure I can come up with a regex that >> works mostly today, using the wikipedia list of AEAD cipher names. But >> such an implementation will not change in lock step with the entire browser >> population, so connection problems will result. Even if I make the list >> configurable, then that is still insufficient as if clients change their h2 >> acceptability list at different times, server configuration will have a >> choice of not talking to a subset. . >> > > You've offered this argument a number of times, but I'm still not > understanding > how this happens. We have an existing list of ciphers which we can divide > along whether they are acceptable or not. I think the 9.2.2 language is > actually pretty clear but maybe I'm just too close to it. In any case, we > can certainly make it unambiguous even if that means listing every > cipher suite that is currently acceptable. In either case, client and > server should > agree for every existing cipher suite. > > My attempt to explain the potential problem. There are two things > negotiated by TLS. One is the upper layer protocol like HTTP1 / HTTP2 and > the other is the cipher. When the protocol specifies also a list of ciphers > then these two decision are not independent. > > For example the TLS library gets updated to support some new cipher Cn > which it thinks is fine with h2. The client offers h1, h2 and some new > protocol Pn and also a list of ciphers including Cn. The server only > supports h1 and h2. Both together with Cn. Now the server selects Cn and > h2. The client TLS layer is fine with this and gives it to the http2 layer. > The http2 layer fails the check as it isn't in its white list. So for TLS > the connection succeeded but the client can't continue with h2. > I see what you mean. I think clearly a conformant HTTP client is going to need to configure the TLS stack to suppress any ciphersuite it doesn't recognize. Now say the API is a bit more elaborated and the TLS library client offer > h1 with cipher set C1, h2 with C2 and Pn with C3. Only C1 and C3 contain > cipher Cn. The TLS client library does a union of the cipher sets and as Pn > is the preferred protocol the Cn is up in the list of ciphers. The server > choose h2 and Cn. Now again the client can't continue although it supports > h2 and Cn. It even can't continue with h1 as h2 was negotiated with ALPN. > Again, this seems like a "don't do that then" kind of situation. -Ekr
Received on Tuesday, 23 September 2014 12:24:23 UTC