> I suspect that some clients fail to use SNI. I've already seen
> this from time to time. It looks like after some errors, they
> refrain from using SNI or even TLS at all and fall back to SSLv3.

This scared my a bit, so I've done some digging.

I've found 2 related bug reports with a lot of details:

NSS: SSL+SNI+client-auth "lost" after some time
https://bugzilla.mozilla.org/show_bug.cgi?id=728715

Apache: SSL+SNI+client-auth "lost" after some time
https://issues.apache.org/bugzilla/show_bug.cgi?id=52703


This behavior seem to arise from a very specific and strange
configuration:
The server supports TLSv1.0 and SNI, but TLSv1.0 is disabled.


Here is what happens:

When the browser starts a fresh ssl session to the server, the
client_hello usually announces TLSv1.0 or TLSv1.1 and the request
contains the server_name (SNI) header.

Since the server on the other side:
- does support SNI, server_name is parsed and used (so this request
  is ok)
- since TLS is disabled on the server, the server_hello contains
  only a SSLv3 announcment
- the session id is exchanged and keepalive and multiple sessions keep
  the service working for a few seconds
- the browser caches the session id and also the fact the the server
  doesn't support TLS
- on subsequent requests, the browser remembers the server is SSLv3-only
  and connects - as per RFC2246 - directly in SSLv3.
- since SSLv3 doesn't support TLS Extenions like SNI, the server_name
  attribute is omitted from the client_hello, and the server has to hand
  out the default certificate.


One can see this behavior very well in the attachment from the NSS
bug report:
session 1:
https://bug728715.bugzilla.mozilla.org/attachment.cgi?id=598729

session 2:
https://bug728715.bugzilla.mozilla.org/attachment.cgi?id=598730


In this case, only one of the following 2 RFC "SHOULD"'s can be implemented,
because a SSLv3 message cannot contain a TLSv1 extension:

RFC2246 (TLSv1.0):
> Whenever a client already knows the highest protocol known to a
> server (for example, when resuming a session), it should initiate the
> connection in that native protocol.

RFC6066 (Transport Layer Security (TLS) Extensions; like SNI):
> The client SHOULD include the same server_name extension in the session
> resumption request as it did in the full handshake that established the
> session.


So in this case, we should verify whether the server allows a TLSv1.0
handshake or if a fallback to SSLv3 is happening.



> bind :443 ssl crt [...] no-tlsv10 ciphers ECDHE-RSA-AES256-SHA:[...]

Kenneth, can you please remove the "no-tlsv10" keyword from the bind line
in your configuration. This will enable TLSv1.0 which I believe will fix
the issue you are seeing.


Lukas

                                          

Reply via email to