在 nginx 错误日志中:“SSL_BYTES_TO_CIPHER_LIST:不适当的回退”

Eri*_*icR 6 ssl nginx openssl

我们最近更改了 nginx 配置以支持 TLSv1.2 以及一些更安全的密码。自从更改后,我们的 nginx 错误日志中充满了以下错误:

2015年1月28日23时55分57秒[暴击] 16898#0:* 18712916 SSL_do_handshake()失败(SSL:错误:140A1175:SSL例程:SSL_BYTES_TO_CIPHER_LIST:不适当的回退),而SSL握手,客户端:. . ,服务器: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;
Run Code Online (Sandbox Code Playgroud)

我们收到了一些关于用户无法访问该网站的电子邮件。一位用户说这是他们在 Firefox 中遇到的错误:

安全连接失败

连接到******.com 时发生错误。服务器拒绝握手,因为客户端降级到低于服务器支持的 TLS 版本。(错误代码:ssl_error_independent_fallback_alert)

由于无法验证接收到的数据的真实性,因此无法显示您尝试查看的页面。

如果我理解正确,那么当客户端使用的 TLS 版本低于它和服务器支持的版本时,回退警报是一种安全预防措施。鉴于我们现在支持更高的协议版本,这个错误似乎很有意义。我不明白的是,为什么此更改会在连接到我们的网站时对某些用户造成问题。这是我们的配置或他们的浏览器的错误吗?

我们现在在 Qualys SSL 服务器测试中得分为“A”,所以我犹豫是否要恢复到我们的旧配置。

Ste*_*ich 12

浏览器通常会进行 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 握手中的随机关闭。