我们最近更改了 nginx 配置以支持 TLSv1.2 以及许多更安全的密码。自从更改以来,我们的 nginx 错误日志中充满了以下错误:
2015/01/28 23:55:57 [crit] 16898#0: *18712916 SSL_do_handshake() SSL 握手时失败(SSL:错误:140A1175:SSL 例程:SSL_BYTES_TO_CIPHER_LIST:不适当的回退),客户端:。。。,服务器:0.0.0.0:443
我们的 nginx 配置如下:
server {
root /var/www/fl/current/public;
listen 443;
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 TLSv1.1 TLSv1.2;
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;
我们收到了几封关于用户无法访问该网站的电子邮件。一位用户说这是他们在 Firefox 中遇到的错误:
安全连接失败
连接到 ******.com 时发生错误。服务器拒绝握手,因为客户端降级到服务器支持的 TLS 版本较低。(错误代码:ssl_error_inappropriate_fallback_alert)
无法显示您尝试查看的页面,因为无法验证所接收数据的真实性。
如果我理解正确,那么回退警报是客户端使用的 TLS 版本低于它和服务器支持的版本时采取的安全预防措施。考虑到我们现在支持更高的协议版本,这个错误似乎很有意义。我不明白的是,为什么这种变化会导致某些用户在连接到我们的网站时出现问题。这是我们的配置还是他们的浏览器的错误?
我们现在在 Qualys SSL 服务器测试中获得了“A”的成绩,所以我不太愿意恢复到以前的配置。
答案1
浏览器通常会进行 SSLv23 握手。通过此握手,它们会宣布其支持的最佳协议版本(目前主要是 TLS1.2),但不会将服务器限制在此版本中。因此,如果服务器具有正确实现和配置的 TLS 堆栈,但仅支持 TLS1.0,则只需回复 TLS1.0,并且连接将在第一次尝试时成功。
但是,服务器端存在一些不良的 TLS 堆栈或错误配置或一些不良的中间件(负载平衡器等),导致此 SSLv23 握手失败。在这种情况下,浏览器会降低握手中使用的协议,即它们尝试使用显式 TLS1.0 握手,然后使用显式 SSL3.0 握手(某些浏览器已禁用 SSL3.0,因此不会尝试此操作)。
如果较新的浏览器进行此类降级连接,它们将使用 TLS_FALLBACK_SCSV 伪密码。如果支持 TLS_FALLBACK_SCSV 的服务器检测到降级连接,并且它支持的协议版本较低(例如,降级使用 TLS1.0,但服务器支持 TLS1.2),则它会假定发生了类似 POODLE 的攻击并关闭连接。
但是为什么客户端在联系您的服务器时会首先降级呢?
- 您前面的负载均衡器可能损坏了,导致某些请求出现问题。
- 您的服务器或前面的某些防 DOS 设备可能会在 SSL 握手完成之前关闭高负载的连接。在这种情况下,浏览器将假设协议存在问题并使用降级版本重试。
- 任何其他类型的问题(例如内存不足等)都可能导致 SSL 握手中随机关闭。
答案2
变更 318904 已上传相关补丁集(由 BBlack 上传):客户端握手 SSL_R_VERSION_TOO_LOW 不受影响