- From: Willy Tarreau <w@1wt.eu>
- Date: Thu, 11 May 2017 16:38:22 +0200
- To: Erik Nygren <erik@nygren.org>
- Cc: Stefan Eissing <stefan.eissing@greenbytes.de>, Kazuho Oku <kazuhooku@gmail.com>, Mark Nottingham <mnot@mnot.net>, "ietf-http-wg@w3.org Group" <ietf-http-wg@w3.org>, "Ponec, Miroslav" <mponec@akamai.com>, "Kaduk, Ben" <bkaduk@akamai.com>
On Thu, May 11, 2017 at 10:21:07AM -0400, Erik Nygren wrote:
> I agree we certainly will need an HTTP status code here and require
> clients that implement sending 0-RTT early data to understand that status
> code
> before sending the early data. (This may be one reason there's urgency to
> specify
> something soon before clients start implementing without a specification.)
Yes definitely!
> I really like Kazuho's idea for HTTP/2 connections. There may also be a way
> for H2 proxies to translate between that and status codes. (ie, if they
> get the HTTP 4xx
> status code from upstream they can make sure that an 1-RTT connection is
> established
> and verified, possibly sending an H2 PING to do so, before resending the
> HTTP request
> as "early data verified by 1RTT handshake".)
For me the H2 ping is mainly a challenge on the connection, equivalent
the RTT achieved by Expect+100 do. On a protocol point of view that's
fine. But I hardly see how to make this thing pass over multiple layers.
You want to validate end-to-end (or at least more than hop-by-hop) and
the ping will only act to the next hop, while the problem caused by
the client and detected by the origin across the LB is still not solved.
> Note that all of this only works for providing safety against replay
> if the decision on when to require 1-RTT is deterministic for a given
> request.
That's why the status code makes it possible to go as far as we want.
Ideally I'd prefer a new Expect: + 100. But that's not doable without
a body. It would look like this :
client server
------ ------
POST /some-url HTTP/1.1
Host: some-host
Expect: replay-safe
HTTP/1.1 418 unsafe try again
or
HTTP/1.1 100 continue
... body ...
On 2.0 we possibly have other options like sending a window update
or priority frame (just thinking), but none of these would easily
address the end-to-end nature of what we want to validate :-/
> For example, doing an H2 PING along with the server_hello and waiting for
> its
> response before processing the request only helps if this will always happen
> for a given early_data request. The early data can always be replayed so
> just
> because it gets verified by one full 1-RTT handshake doesn't mean that same
> early data can't just get replayed without a 1-RTT handshake by an attacker
> immediately afterwards.
One more reason for asking the client to retransmit everything we decided
is not trusted.
Willy
Received on Thursday, 11 May 2017 14:38:57 UTC