Nginx-1.19.6 Openssl 1.1.1i — не удается выполнить SSL-рукопожатие

#nginx #ssl #openssl

#nginx #ssl #openssl

Вопрос:

я пытаюсь запустить сервер, используя Nginx с поддержкой sslv3 и шифров RC4-SHA: поддержка RC4-MD5 (мне нужны именно эти шифры). Я смог сделать это в Ubuntu 16.04, используя исходный код Openssl 1.0.2u последний исходный код версии nginx (nginx-1.19.6). Я создал Nginx с помощью этой команды:

./configure --with-http_ssl_module --with-openssl=/path/to/openssl-1.0.2u --with-openssl-opt=enable-ssl3 --with-openssl-opt=enable-ssl3-method --with-openssl-opt=enable-weak-ssl-ciphers

Конфигурация Nginx, которую я использовал, является:

 server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_protocols SSLv3;
    ssl_ciphers RC4-SHA:RC4-MD5:@SECLEVEL=0;
    ssl_certificate /path/to/server-chain.crt;
    ssl_certificate_key /path/to/server.key;
    server_name server.name.net;
    underscores_in_headers on;
    proxy_pass_request_headers on;
    location / {    
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:9000;
    }
}
 

После настройки конфигурационного файла nginx все работало отлично. Я смог получить сертификат ssl с помощью этой команды с компьютера Ubuntu 14.04:

openssl s_client -connect MyIP:443 -ssl3 -cipher RC4-SHA:RC4-MD5 .

Я попытался сделать то же самое, создав Nginx с помощью Openssl 1.1.1. я использую те же параметры конфигурации, но после настройки файла nginx conf, когда я пытаюсь запустить openssl s_client -connect... команду, я получаю эту ошибку:

 CONNECTED(00000003)
140420793624224:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:339:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 7 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : SSLv3
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1612540521
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
 

В файле Nginx error.log я получил следующее:

 SSL_do_handshake() failed (SSL: error:141FC044:SSL routines:tls_setup_handshake:internal error) while SSL handshaking, client: 192.168.1.10, server: 0.0.0.0:443
 

Что-то изменилось с openssl 1.1.1? Мне не хватает каких-либо параметров конфигурации для включения SSLv3 RC4-SHA: RC4-MD5?
Спасибо за любые советы!

Ответ №1:

В конце концов я смог это исправить!

Я загрузил последний исходный код openssl (1.1.1i) и последний исходный код nginx (1.19.6). Я скомпилировал и установил openssl со следующими командами:

 ./config enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers
make
sudo make install
 

Я отредактировал файл openssl.cnf (/usr/local/ssl/openssl.cnf), добавив

 openssl_conf = default_conf
 

в начале файла и добавление

 [default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = ALL:@SECLEVEL=0
 

в нижней части файла. Это позволяет использовать старые шифры (мне нужны были RC4-SHA и RC4-MD5).
Затем я скомпилировал и установил nginx со следующими командами:

 ./configure --with-http_ssl_module --with-ld-opt="-L/usr/local"
make
sudo make install
 

После настройки nginx для ssl-сертификатов я смог получить их с помощью openssl s_client... команды!

Ответ №2:

Шифры SSL в nginx должны поддерживаться вашей версией OpenSSL. Из списка изменений OpenSSL 1.0.2h и 1.1.0:

Шифры libssl на основе RC4 теперь классифицируются как «слабые» шифры и по умолчанию отключены. Их можно повторно включить, используя опцию enable-weak-ssl-ciphers для настройки.

Комментарии:

1. Я скомпилировал nginx с openssl, используя enable-weak-ssl-ciphers (написал полную команду выше). Я также добавил @SECLEVEL=0 в строку ssl_chipers. Я не могу понять, что я делаю не так

2. О, извините! Я так не думал, потому что в вашей команде была ссылка 1.0.2, и я даже не смог скомпилировать недавний nginx с этими флагами (из-за отсутствия pcre и zlib в моей лаборатории). Я только что скомпилировал ту же конфигурацию (1.19.6 openssl 1.1.1), а также не могу получить результат с помощью -connect 1.0.2g openssl на ubuntu ubuntu (последние версии даже не принимаются -ssl3 ) — с другой ошибкой на стороне SSL, но такой же на стороне nginx. Также sslyze не смог найти соответствующий шифр, что необычно…

3. Чтобы исправить prce и zlib, просто запустите это: sudo apt-get install libpcre3 libpcre3-dev zlib1g zlib1g-dev

4. Я связал их вручную, поскольку я сам компилирую nginx на регулярной основе. Вот почему я подумал, что «это может быть простой способ» — это не так 😉 Все еще понятия не имею, в чем может быть проблема.

5. Копаясь на странице nginx, на которую вы ссылались выше, я нашел эту страницу: openssl.org/docs/man1.1.1/man3/SSL_CTX_set_security_level.html В Примечаниях говорится о опции -DOPENSSL_TLS_SECURITY_LEVEL=level . Я пытался использовать его (= 0), но старые шифры полностью исчезли с ним…