SSL握手时nginx严重错误

时间:2015-01-18 14:00:27

标签: ssl nginx openssl ubuntu-14.04

我在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的版本无关。

P.S.2。我认为这个crtitical错误可能会影响我的整个虚拟机。我还遇到了“不时”崩溃VM的问题。

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

2 个答案:

答案 0 :(得分:8)

  SSL握手时,

... BYTES_TO_CIPHER_LIST:不合适的后备),客户端: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;
        }

答案 1 :(得分:0)

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

所以客户端以后没有机会连接我们的服务器?

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