リモートの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;
}
}
問題は、次のopenssl
呼び出しからわかるように、リモートHTTPSサーバーがSSLv3経由の接続のみを受け入れることができることです。
機能していない:
$ 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>
現在のセットアップでは、私のnginxプロキシは502 Bad Gateway
ブラウザで接続したとき。エラーログで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にダウングレードする必要があります。
これは、Nginxがバックエンドサーバーに接続しようとするたびにTLSv1.1とTLSv1.2が導入されたopensslバージョン1.0.1でコンパイルされたNginxを使おうとすると、peer closed connection in SSL handshake (54: Connection reset by peer) while SSL handshaking to upstream
Nginx Debug Logsでは、バックエンドはTLSv1.1およびTLSv1.2をサポートしていません。
ロードバランサーを使用している場合、お客様/クライアントはロードバランサーファームウェアをアップグレードする必要があります。
Nginxボックスのopensslライブラリをアップグレードする最近の更新後、Windows 2003でNginxをIIS 6にリバースプロキシするという同様の問題に遭遇しました。私にとってうまくいったのは、Nginxディレクティブを変更することです。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
に
proxy_ssl_protocols TLSv1;
サーバーによって告知される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;