Протокол TLSv1.3 и директива ssl_reject_handshake в сервере по-умолчанию

Gena Makhomed gmm на csdoc.com
Чт Янв 28 01:00:11 UTC 2021


Здравствуйте, All!

nginx/1.19.6 из официального репозитория nginx.org
openssl-1.1.1g-12.el8_3.x86_64 из репозитория CentOS 8.3

Протокол TLSv1.3 включен, но если в сервере по умолчанию прописать
директиву "ssl_reject_handshake on;" тогда протокол TLSv1.3 перестает
работать для всех серверов.

Фрагмент конфигурации nginx на уровне http:

http {
     # ...
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_prefer_server_ciphers off;
     ssl_ciphers 
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
     ssl_conf_command Ciphersuites 
TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384;
     # ...
}

Комментирование директивы "ssl_conf_command Ciphersuites ... ;"
не помогает решить проблему - протокол TLSv1.3 по прежнему не работает.

Конфигурация сервера по-умолчанию:

# cat /etc/nginx/conf.d/default.conf

server {
     listen 111.111.111.111:443 bind default_server ssl http2;
     ssl_reject_handshake on;
     server_name default-server;
     location / {
         return 444;
     }
}

Конфигурация обычного сервера:

# cat /etc/nginx/conf.d/example.com.conf
server {
     listen 111.111.111.111:443 ssl http2;
     server_name example.com;
     ssl_certificate 
/etc/letsencrypt/live/example.com/fullchain.pem;
     ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
     add_header Strict-Transport-Security max-age=31536000 always;
     location / {
         return 200 "OK";
     }
}

Попытка подключения к серверу example.com по протоколу TLSv1.3 
завершается ошибкой:

# openssl s_client -tls1_3 -connect example.com:443 -servername example.com
CONNECTED(00000003)
140542584969024:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert 
protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 235 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Это ошибка в nginx или я что-то делаю не так?

Если в сервере по-умолчанию закомментировать директиву
"ssl_reject_handshake on;" и прописать какой-нибудь сертификат,

     #ssl_reject_handshake on;
     ssl_certificate 
/etc/letsencrypt/live/example.net/fullchain.pem;
     ssl_certificate_key     /etc/letsencrypt/live/example.net/privkey.pem;

Тогда попытка подключения к серверу example.com по протоколу TLSv1.3 
завершается успешно:

# openssl s_client -tls1_3 -connect example.com:443 -servername example.com

CONNECTED(00000003)
---
Certificate chain
  0 s:CN = example.com
    i:C = US, O = Let's Encrypt, CN = R3
  1 s:C = US, O = Let's Encrypt, CN = R3
    i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru