Nginx

為 nginx 代理伺服器強制使用特定的 SSL 協議

  • October 19, 2017

我正在開發一個針對遠端 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。

引用自:https://serverfault.com/questions/436737