过去一周,客户端在使用 Firefox 时会随机收到间歇性 ssl_error_no_cypher_overlap 错误。Safari 和 Chrome 也出现了连接问题。我找不到此问题开始时发生的任何软件包或代码更新。
我们在三台服务器之间进行负载平衡,并且这三台服务器都具有相同版本的 nignx(1.6.2-1.el5.ngx)和 openssl(0.9.8e-32.el5_11),以及指定支持哪些协议和密码的相同配置(根据 Mozilla 推荐的 nginx 配置)。
我不知道我在这里错过了什么。
所有服务器共享的 nginx 配置:
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;
在我们的日志中:
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
通过快速 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
答案1
您在密码字符串中提供的许多密码(如 GCM、SHA384 和 EC)不适用于您使用的旧版 OpenSSL。这样就只剩下几个密码了。公司中的客户经常使用某些(可能是透明的)代理进行 SSL 拦截(即中间人攻击)来分析加密内容中是否存在恶意软件。在这种情况下,可用的密码不是由浏览器决定的,而是由拦截代理决定的。您提供的几个密码可能根本不够用,因为拦截设备不支持它们,从而导致required cipher missing
。
答案2
日志显示客户端正在尝试通过 SSLv3 进行连接,但无法连接,因为您的服务器不支持 SSLv3。这可能是因为他们尝试了 TLSv1.2,然后是 TLSv1.1,然后跳到 SSLv3,因为您不支持 TLSv1.1 或 1.2。
ssl_protocols
将您的线路切换至TLSv1 TLSv1.1 TLSv1.2
。