【问题标题】:nginx critical error with SSL handshakingSSL握手的nginx严重错误
【发布时间】:2015-03-16 14:58:37
【问题描述】:

我在 Ubuntu 14.04 LTS 上的 nginx 有问题。有时我会遇到严重错误:

2015/01/18 12:59:44 [crit] 1065#0: *28289 SSL_do_handshake() failed (SSL: error:140A1175:SSL routines:SSL_BYTES_TO_CIPHER_LIST:inappropriate fallback) while SSL handshaking, client: 10.0.2.2, server: 0.0.0.0:443

我检查了我的 OpenSSL 的版本:

root@www:~# ldd `which nginx` | grep ssl
        libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f39e236b000)

root@www:~# strings /lib/x86_64-linux-gnu/libssl.so.1.0.0 | grep "^OpenSSL "
OpenSSL 1.0.1f 6 Jan 2014

我搜索了有关它的更多信息,发现它可能是旧版本 OpenSSL 的问题。所以我尝试编译最新版本:

wget https://www.openssl.org/source/openssl-1.0.1l.tar.gz && tar xzf && cd openssl-1.0.1l

./config && make && make install

我还通过符号链接将旧的 OpenSSL 二进制文件替换为新的:

ln -sf /usr/local/ssl/bin/openssl `which openssl`

之后我有:

root@www:~# openssl version
OpenSSL 1.0.1l 15 Jan 2015

但我在 nginx 中仍然有旧版本:

root@www:~# strings /lib/x86_64-linux-gnu/libssl.so.1.0.0 | grep "^OpenSSL "
OpenSSL 1.0.1f 6 Jan 2014

更新 OpenSSL 后,我在 Ubuntu 中找不到任何其他新的 libssl。如何更新 libssl 以便 nginx 可以使用最新版本?

P.S.1。可能严重错误的问题与 OpenSSL 的版本无关。

附注 2。我认为这个严重错误可能会影响我的整个虚拟机。我也有“不时”VM崩溃的问题。

我尝试了很多东西,现在我绝望了。 Stackoverflow 请帮忙!

【问题讨论】:

    标签: ssl nginx openssl ubuntu-14.04


    【解决方案1】:

    ...BYTES_TO_CIPHER_LIST:不适当的回退),同时 SSL 握手,客户端:10.0.2.2,服务器:0.0.0.0:443

    这看起来像是有人在检查服务器是否支持 TLS_FALLBACK_SCSV,在您的情况下确实如此。没什么可担心的。相反,这意味着您的服务器支持有用的安全功能。有关 TLS_FALLBACK_SCSV 以及如何通过这种方式检测像 POODLE 这样的 SSL 降级攻击的更多信息,您可以查看 http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/

    TLS_FALLBACK_SCSV 是一个相当新的选项,旨在检测 SSL 降级攻击。它需要客户端和服务器的支持。较旧的 nginx/OpenSSL 和较旧的浏览器根本没有此选项,因此无法检测到此问题,因此无法登录早期版本。此消息很关键,因为它可能表示针对被此选项击败的客户端的实际 SSL 降级攻击尝试。在实践中,它可能是一些用于支持该选项的工具探测,例如SSLLabs

    参考ssl/ssl_lib.c函数ssl_bytes_to_cipher_list的相关代码:

    /* Check for TLS_FALLBACK_SCSV */
    if ((n != 3 || !p[0]) &&
            (p[n-2] == ((SSL3_CK_FALLBACK_SCSV >> 8) & 0xff)) &&
            (p[n-1] == (SSL3_CK_FALLBACK_SCSV & 0xff)))
            {
            /* The SCSV indicates that the client previously tried a higher version.
             * Fail if the current version is an unexpected downgrade. */
            if (!SSL_ctrl(s, SSL_CTRL_CHECK_PROTO_VERSION, 0, NULL))
                    {
                    SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_INAPPROPRIATE_FALLBACK);
                    if (s->s3)
                            ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INAPPROPRIATE_FALLBACK);
                    goto err;
                    }
            p += n;
            continue;
            }
    

    【讨论】:

    • 我以前从未遇到过这个问题。早些时候,我将 Debian 与较旧的 nginx 一起使用。如果这个问题在 nginx 日志中被标记为关键问题,那么它的关键是什么?你的回答很明确,一点问题都没有。我不明白。
    • 我已更新答案以包含更多信息。
    • 感谢您解释问题@Steffen Ullrich。手动更新 OpenSSL 包和 Ubuntu 上的 nginx 后,问题仍然存在。在日常活动中,nginx 会生成几十个错误日志,内容如下:2015/01/27 10:06:15 p.m. [crit] 730 # 0: * 263,168 SSL_do_handshake () failed (SSL: error: 140A1175: SSL routines: SSL_BYTES_TO_CIPHER_LIST: Inappropriate fallback) SSL 握手时,客户端:10.0.2.2,服务器:0.0.0.0:443
    • 日常不影响服务器正常运行,但时不时连续出现错误(字符串)。它每隔一秒就会阻塞错误日志并最终阻塞虚拟机上的所有服务(包括 nginx、php5-fpm、proftpd、nodejs)。在这种情况下,我所能做的就是重新启动系统。我意识到您所描述的内容不应该影响 nginx 的功能或服务器的操作,但在我的情况下完全相反。它会导致一个巨大的问题,即阻止网站并阻止用户进入。
    • 是否有关闭导致这些致命错误的 SSL 功能的选项?
    【解决方案2】:

    会影响客户端发送请求吗?据我了解,客户端将他的第一个请求发送到我们的服务器,但也许我们的负载平衡在第一次连接失败时发生的高负载。然后客户端尝试降级其协议版本重试连接,但由于我们的服务器支持TLS_FALLBACK_SCSV,它会做ssl握手失败。

    那么客户端以后就没有机会连接我们的服务器了吗?

    如果我们的负载均衡恢复正常负载,客户端是否有机会成功重试与高协议版本的连接?

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2018-08-23
      • 2016-08-08
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多