Centos – intermittent ssl_error_no_cypher_overlap

centosssl

For the past week, clients have been randomly getting intermittent ssl_error_no_cypher_overlap errors when using Firefox. Connection issues have also occurred in Safari and Chrome. I can't find any package or code updates that occurred when this problem began.

We load balance between three servers, and all three have the same versions of nignx (1.6.2-1.el5.ngx) and openssl (0.9.8e-32.el5_11), as well as the same configuration specifying which protocols and ciphers are supported (as per Mozilla's recommended nginx config).

I don't know what I am missing here.

nginx config shared across all servers:

  ssl                 on;
  ssl_certificate     /etc/nginx/ssl/wildcard.pem;
  ssl_certificate_key /etc/nginx/ssl/wildcard.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols TLSv1;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;

In our logs:

2015/01/21 11:16:05 [crit] 3428#0: *150887640 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:17:34 [crit] 3429#0: *150929634 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:18:23 [crit] 3434#0: *150952369 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:18:23 [crit] 3434#0: *150952368 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:18:30 [crit] 3428#0: *150955385 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:18:43 [crit] 3433#0: *150961363 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443
2015/01/21 11:18:53 [crit] 3428#0: *150965840 SSL_do_handshake() failed (SSL: error:1408A0D7:SSL routines:SSL3_GET_CLIENT_HELLO:required cipher missing) while SSL handshaking, client: *.*.*.*, server: 0.0.0.0:443

And from a quick sslscan:

  Supported Server Cipher(s):
    Accepted  TLSv1  256 bits  DHE-RSA-AES256-SHA
    Accepted  TLSv1  256 bits  AES256-SHA
    Accepted  TLSv1  128 bits  DHE-RSA-AES128-SHA
    Accepted  TLSv1  128 bits  AES128-SHA
    Accepted  TLSv1  168 bits  DES-CBC3-SHA

  Prefered Server Cipher(s):
    TLSv1  128 bits  DHE-RSA-AES128-SHA

Best Answer

Lots of the ciphers (like GCM, SHA384 and EC) you give in your cipher string are not available with the old OpenSSL version you are using. This leaves only a few ciphers. Clients in companies are often behind some (maybe transparent) proxy doing SSL interception (i.e. man-in-the-middle attack) to analyze encrypted content for malware. In this case the available ciphers are not determined by the browser, but by the intercepting proxy. It might be that the few ciphers you offer are simply not sufficient because they are not supported by the intercepting device, resulting in required cipher missing.