Я разрабатываю приложение для удаленной веб-службы https. Во время разработки мне нужно отправлять запросы прокси с моего локального сервера разработки (запускающего nginx на ubuntu) на удаленный веб-сервер https. Вот соответствующая конфигурация 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>
При текущей настройке мой прокси-сервер nginx дает 502 Bad Gateway
когда я подключаюсь к нему в браузере. Включение 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. Вот команды, которые успешно сделали это для меня (на ubuntu 12.04, работающем на AMD64):
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.1, в которой они представили 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.
Если используется Load Balancer, вам / клиенту необходимо обновить встроенное программное обеспечение Load Balancer.
Я столкнулся с аналогичной проблемой при обратном проксировании Nginx в IIS 6 в Windows 2003 после недавнего обновления, в котором были обновлены библиотеки openssl в окне Nginx. У меня сработало изменение директивы Nginx:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
к
proxy_ssl_protocols TLSv1;
Описано возможное решение вашей проблемы. Вот
Из-за ошибки вам необходимо перейти на OpenSSL 1.0.0 в системе Nginx.
Попробуйте принудительно объявить версию 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;