强制 nginx 代理服务器使用特定的 SSL 协议

强制 nginx 代理服务器使用特定的 SSL 协议

我正在开发一个针对远程 https Web 服务的应用程序。在开发过程中,我需要将来自本地开发服务器(在 ubuntu 上运行 nginx)的请求代理到远程 https Web 服务器。以下是相关的 nginx 配置:

server {
    server_name project.dev;
    listen 443;
    ssl on;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    location / {

        proxy_pass      https://remote.server.com;
        proxy_set_header Host remote.server.com;
        proxy_redirect off;
    }
}

问题是远程 HTTPS 服务器只能接受通过 SSLv3 的连接,从以下openssl调用可以看出。

不工作:

$ openssl s_client -connect remote.server.com:443                 
CONNECTED(00000003)
139849073899168:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 226 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

在职的:

$ openssl s_client -connect remote.server.com:443 -ssl3
CONNECTED(00000003)
<snip>
---
SSL handshake has read 1562 bytes and written 359 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 1024 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : SSLv3
    Cipher    : RC4-SHA
<snip>

使用当前设置,502 Bad Gateway当我在浏览器中连接到我的 nginx 代理时,它会给出一个。debug在错误日志中启用后,我可以看到以下消息:[info] 1451#0: *16 peer closed connection in SSL handshake while SSL handshaking to upstream

我尝试添加ssl_protocols SSLv3;到 nginx 配置但没有帮助。

有人知道我该如何设置才能使其正确工作吗?

编辑- 添加了额外请求的信息:

在 Ubuntu 12.04 上运行 OpenSSL 版本:

$ openssl version
OpenSSL 1.0.1 14 Mar 2012

解决方案

解决方案(由以下 @Christopher Perrin 提供)是将 openssl 降级到 1.0.0。以下是成功为我执行此操作的命令(在运行于 AMD64 的 ubuntu 12.04 上):

wget http://launchpadlibrarian.net/81976289/openssl_1.0.0e-2ubuntu4_amd64.deb
sudo dpkg -i openssl_1.0.0e-2ubuntu4_amd64.deb
wget http://launchpadlibrarian.net/81976290/libssl1.0.0_1.0.0e-2ubuntu4_amd64.deb
sudo dpkg -i libssl1.0.0_1.0.0e-2ubuntu4_amd64.deb

答案1

您的问题的可能解决方案如下这里

由于 Nginx 系统中存在一个 Bug,您必须将版本降级至 OpenSSL 1.0.0。

答案2

这是因为当您尝试使用 Openssl 版本 1.0.1 编译 Nginx 时,他们引入了 TLSv1.1 和 TLSv1.2,每当 Nginx 尝试连接到后端服务器时,它都会peer closed connection in SSL handshake (54: Connection reset by peer) while SSL handshaking to upstream在 Nginx 调试日志中重置连接,这意味着后端不支持 TLSv1.1 和 TLSv1.2。

如果正在使用负载均衡器,那么您/客户需要升级他们的负载均衡器固件。

答案3

在最近的一次更新升级了 Nginx 框上的 openssl 库后,我在将 Nginx 反向代理到 Windows 2003 上的 IIS 6 时遇到了类似的问题。对我有用的是更改 Nginx 指令:

ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;

proxy_ssl_protocols   TLSv1;

答案4

尝试强制使用服务器公布的 SSL 版本

ssl_prefer_server_ciphers on;
ssl_protocols SSLv3 TLSv1;
# Set the ciphers to use. You may have to fix formatting. 
ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:\
            EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:\
            AES128-SHA:RC4-SHA:RC4-MD5;

相关内容