Назад | Перейти на главную страницу

Принудительное использование определенного протокола SSL для прокси-сервера nginx

Я разрабатываю приложение для удаленной веб-службы 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;