https://bz.apache.org/bugzilla/show_bug.cgi?id=64437

--- Comment #8 from Yann Ylavic <[email protected]> ---
I filled a PR for openssl 2 days ago (see [1]).

openssl s_server with "/reneg" does not behave correctly (IMHO), it assumes
that the request is a single line, which is never true for HTTP/1.x requests
for instance.
So long as the request is a single line (like an HTTP/0.9 "GET /\r\n"), there
is nothing buffered by s_server (which it can BIO_gets() immediately), thus the
handshake completes.
But otherwise, s_server will send its HelloRequest to start the renegotiation,
read the *buffered* second line (which does not trigger the handshake), and go
straight to the HTTP response (application data).

On the mod_proxy side (as SSL client), after sending the request to the backend
and while reading the response header (line by line), it first gets the
HelloRequest and then sends its ClientHello to satisfy the renegotitation, and
then by reading the next step of the handshake it gets the application data
directly (full response header + body, which it buffers).
Now thanks to [2] (as you noted in comment 3), application data are "kind of
valid" when the client is in ClientHello state, so the first response line is
read successfully and returned. But the connection somehow is still in
ClientHello state (hence PR [1] to ask for clarification), so mod_proxy still
thinks it is in the middle of a handshake (per SSL_is_init_finished() returning
0), thus when reading the second response line it thinks it should
start/continue the handshake, which fails because the connection has been
closed by s_server already.

So what my patch does is that it always tries to read from the buffered data
before asking for complete handshake to the openssl layer, and let openssl
handle renegotiations on its own (if any), thus the reponse which was already
fully buffered is returned and mod_proxy can proceed with the response to the
client. The connection closed is not an error anymore (that's the end of the
body for a response without Content-Length), and everything seems to work, but
still the SSL client connection state remains in an exit/error path all that
long.

So I'm not sure it's the correct fix, unless the openssl team clarifies this
ClientHello => application data non-transition but no-failure either case.
What is a SSL client supposed to do while !SSL_is_init_finished(), handshake or
read? I'm a bit nervous about the patch's SSL_total_renegotiations() != 0
workaround / bypass...


[1] https://github.com/openssl/openssl/pull/12081
[2]
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1g/ssl/record/rec_layer_s3.c#L1727

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to