我正在开发一个针对远程 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;