為 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 配置,但沒有幫助。有誰知道我可以如何設置它以正常工作?
編輯- 添加了額外的請求資訊:
在帶有 OpenSSL 版本的 Ubuntu 12.04 上執行:
$ 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
此處描述了您的問題的可能解決方案
由於一個錯誤,您必須在 Nginx 系統中降級到 OpenSSL 1.0.0。
這是因為當您嘗試使用 Openssl 版本 1.0.1 編譯 Nginx 時,當 Nginx 嘗試連接到後端伺服器時,他們引入了 TLSv1.1 和 TLSv1.2,它會
peer closed connection in SSL handshake (54: Connection reset by peer) while SSL handshaking to upstream
在 Nginx 調試日誌中重置連接表示後端不支持 TLSv1.1 和 TLSv1.2。如果正在使用負載均衡器,那麼您/客戶需要升級他們的負載均衡器 Frimware。