Протокол 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