1

If I connect to a server using a specific SSL protocol version, but no cipher-suites are offered under that protocol, would that protocol still be considered supported?

For example, connecting to a server using SSLv2: the server accepts my SSLv2 client-hello, but in the response there are no supported cipher-suites. SSLv2 is insecure and should never be supported, but if the protocol is enabled and no cipher-suites are available, is that still considered supported?

  • 1
    Wouldn't e.g. TLS 1.2 section 9 play a role here? "In the absence of an application profile standard specifying otherwise, a TLS-compliant application MUST implement the cipher suite TLS_RSA_WITH_AES_128_CBC_SHA (see Appendix A.5 for the definition)." – Maarten Bodewes Jan 16 '17 at 23:09
4

A protocol version is considered supported if you can successfully finish the TLS handshake with this protocol version. Since a successful handshake includes a key exchange which requires a cipher it does not count as successful if no common cipher can be found.

2

If your client is implemented according to the specifications it should abort if it does not receive a matching cipher in the server hello.


In SSL 2.0 [1] this would look as follows:

NO-CIPHER-ERROR This error is returned by the client to the server when it cannot find a cipher or key size that it supports that is also supported by the server. This error is not recoverable.


And in TLS 1.2 [2] as follows:

handshake_failure Reception of a handshake_failure alert message indicates that the sender was unable to negotiate an acceptable set of security parameters given the options available. This is a fatal error.


[1] https://tools.ietf.org/html/draft-hickman-netscape-ssl-00

[2] https://tools.ietf.org/html/rfc5246

0

No.

SSL/TLS decides on the protocol version as follows:

  • The client sends a ClientHello message containing the highest SSL/TLS version supported by the client.
  • The server compares its maximum supported SSL/TLS version to the one supported by the client, and tries to pick the highest version supported by both client and server.
  • If an appropriate version is selected, it is sent back within the ServerHello message. If not, the connection is closed with an error message.

In the case of your client trying to use SSLv2, your initial ClientHello packet would report the maximum version as SSLv2. If the server does not support SSLv2 then it would reject the connection. If your client reported a higher supported version in the ClientHello, then the server would not respond with any SSLv2 cipher suites, and therefore an SSLv2 connection would not be possible.

0

Based on the answers so far, I've done some debug using an old version of Apache httpd with SSLv2 enabled and get the following debug logs; one with SSLv2 enabled (but without ciphers) and one with SSLv2 disabled:

SSLv2 not enabled:

[info] [client 192.168.56.1] Connection to child 66 established (server 127.0.1.1:443)
[info] Seeding PRNG with 656 bytes of entropy
[debug] ssl_engine_kernel.c(1901): OpenSSL: Handshake: start
[debug] ssl_engine_kernel.c(1909): OpenSSL: Loop: before/accept initialization
[debug] ssl_engine_io.c(1881): OpenSSL: read 11/11 bytes from BIO#7f86fdb62540 [mem: 7f86fdb69e70] (BIO dump follows)
[debug] ssl_engine_io.c(1814): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1853): | 0000: 80 25 01 00 02 00 0c 00-00 00 10                 .%.........      |
[debug] ssl_engine_io.c(1859): +-------------------------------------------------------------------------+
[debug] ssl_engine_kernel.c(1938): OpenSSL: Exit: error in SSLv2/v3 read client hello A
[info] [client 192.168.56.1] SSL library error 1 in handshake (server 127.0.1.1:443)
[info] SSL Library Error: 336027900 error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol speaking not SSL to HTTPS port!?
[info] [client 192.168.56.1] Connection closed to child 66 with abortive shutdown (server 127.0.1.1:443)

SSLv2 enabled, but no ciphers offered:

[info] [client 192.168.56.1] Connection to child 6 established (server 127.0.1.1:443)
[info] Seeding PRNG with 656 bytes of entropy
[debug] ssl_engine_kernel.c(1901): OpenSSL: Handshake: start
[debug] ssl_engine_kernel.c(1909): OpenSSL: Loop: before/accept initialization
[debug] ssl_engine_io.c(1881): OpenSSL: read 11/11 bytes from BIO#7fefb8bd5540 [mem: 7fefb8bdce70] (BIO dump follows)
[debug] ssl_engine_io.c(1814): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1853): | 0000: 80 25 01 00 02 00 0c 00-00 00 10                 .%.........      |
[debug] ssl_engine_io.c(1859): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1881): OpenSSL: read 28/28 bytes from BIO#7fefb8bd5540 [mem: 7fefb8bec11b] (BIO dump follows)
[debug] ssl_engine_io.c(1814): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1853): | 0000: 05 00 80 03 00 80 01 00-80 07 00 c0 42 8e 70 80  ............B.p. |
[debug] ssl_engine_io.c(1853): | 0010: 2f 51 05 45 fe d2 37 a8-57 38 04 eb              /Q.E..7.W8..     |
[debug] ssl_engine_io.c(1859): +-------------------------------------------------------------------------+
[debug] ssl_engine_kernel.c(1909): OpenSSL: Loop: SSLv2 read client hello A
[debug] ssl_engine_kernel.c(1909): OpenSSL: Loop: SSLv2 write server hello A
[debug] ssl_engine_io.c(1881): OpenSSL: read 2/2 bytes from BIO#7fefb8bd5540 [mem: 7fefb8bec110] (BIO dump follows)
[debug] ssl_engine_io.c(1814): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1853): | 0000: 80 03                                            ..               |
[debug] ssl_engine_io.c(1859): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1881): OpenSSL: read 3/3 bytes from BIO#7fefb8bd5540 [mem: 7fefb8bec112] (BIO dump follows)
[debug] ssl_engine_io.c(1814): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1853): | 0000: 00 00 01                                         ...              |
[debug] ssl_engine_io.c(1859): +-------------------------------------------------------------------------+
[debug] ssl_engine_kernel.c(1933): OpenSSL: Exit: failed in SSLv2 read client master key A
[info] [client 192.168.56.1] SSL library error 1 in handshake (server 127.0.1.1:443)
[info] SSL Library Error: 335982795 error:1406B0CB:SSL routines:GET_CLIENT_MASTER_KEY:peer error no cipher
[info] [client 192.168.56.1] Connection closed to child 6 with abortive shutdown (server 127.0.1.1:443)

The handshake fails in both cases, for different reasons. A handshake failure is therefore equivalent to the protocol not being supported (as per accepted answer).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.