<div dir="auto">Pretty cool.<div dir="auto"><br></div><div dir="auto">I'm still reading up on each but can this also be done for https termination? Is the SSL pre-read limitation the main issue there?</div><div dir="auto"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 1 Jun 2023, 9:31 pm Stephen Farrell, <<a href="mailto:stephen.farrell@cs.tcd.ie" target="_blank" rel="noreferrer">stephen.farrell@cs.tcd.ie</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Hi all,<br>
<br>
I've been working on implementing TLS encrypted client hello<br>
(ECH, [1]) in the OpenSSL library (current branch at [2]).<br>
Apologies that this mail requires a bit of knowledge of<br>
what ECH does - I'd guess some folks on here will know that<br>
already but I'm happy to explain as needed.<br>
<br>
I have various proof of concept integrations for my code<br>
including with nginx (branch at [3]). Adding support for<br>
ECH when nginx terminates TLS was pretty straightforward<br>
but I have a question about whether the direction I've<br>
taken for ECH in "split-mode" is sensible or not.<br>
<br>
ECH "split-mode" is where nginx will do the ECH decryption<br>
but the TLS session is negotiated between the client and<br>
the upstream. I added some code [4] to the ssl preread<br>
stream module that does the ECH decryption of the initial<br>
ClientHello, then forwards on the decrypted ClientHello to<br>
the upstream. Again that was pretty easy and seems to work<br>
fine.<br>
<br>
The question that I have relates to when the TLS handshake<br>
between client and upstream hits a HelloRetryRequest. In<br>
that case the client will ECH encrypt it's second ClientHello<br>
but the ssl preread module doesn't get to see that 2nd<br>
ClientHello to attempt ECH decryption.<br>
<br>
So I ended up adding code [5] to the stream proxy module that<br>
checks if we're in that ECH split-mode + "pending" HRR state<br>
and attempts the ECH decryption if so. After (a lot:-) of<br>
trying to figure out where to put that code, it now also<br>
seems to work ok.<br>
<br>
But, I'm wondering if that's the right way to handle doing<br>
things with the 2nd ClientHello when we hit HRR and are<br>
using the stream module(s) but nginx is not terminating<br>
the TLS session?<br>
<br>
Any comments or advice most welcome!<br>
<br>
Thanks,<br>
Stephen.<br>
<br>
PS: It'll be a while before ECH is part of the OpenSSL<br>
library but once that's happening I do plan to follow up<br>
submitting these changes as they are at that time.<br>
<br>
[1] <a href="https://datatracker.ietf.org/doc/draft-ietf-tls-esni/" rel="noreferrer noreferrer noreferrer" target="_blank">https://datatracker.ietf.org/doc/draft-ietf-tls-esni/</a><br>
[2] <a href="https://github.com/sftcd/openssl/tree/ECH-draft-13c" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/sftcd/openssl/tree/ECH-draft-13c</a><br>
[3] <a href="https://github.com/sftcd/nginx/tree/ECH-experimental" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/sftcd/nginx/tree/ECH-experimental</a><br>
[4] <br>
<a href="https://github.com/sftcd/nginx/blob/ECH-experimental/src/stream/ngx_stream_ssl_preread_module.c#L129" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/sftcd/nginx/blob/ECH-experimental/src/stream/ngx_stream_ssl_preread_module.c#L129</a><br>
[5] <br>
<a href="https://github.com/sftcd/nginx/blob/ECH-experimental/src/stream/ngx_stream_proxy_module.c#L1719" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/sftcd/nginx/blob/ECH-experimental/src/stream/ngx_stream_proxy_module.c#L1719</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" rel="noreferrer noreferrer" target="_blank">nginx-devel@nginx.org</a><br>
<a href="https://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer noreferrer noreferrer" target="_blank">https://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</blockquote></div>