
У меня запущен nginx (1.21.6) с openssl 1.1.1n на сервере Debian 11. Хотя я следовал многим руководствам и просмотрел множество вопросов на этом форуме по этой теме, я не могу заставить работать TLS 1.3. Вывод nginx -V
:
nginx version: nginx/1.21.6
built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
built with OpenSSL 1.1.1k 25 Mar 2021 (running with OpenSSL 1.1.1n 15 Mar 2022)
TLS SNI support enable
Я обновил nginx до основной версии, потому что не смог заставить работать TLS 1.3 в предыдущих версиях. Это очень странно... Openssl определенно поддерживает TLS 1.3. Я проверил его, и openssl s_client -tls1_3 -connect www.cloudflare.com:443
он работал хорошо. Вот мой ssl.conf
файл nginx, который я включил в каждый из моих серверов nginx (сертификаты включены отдельно в разделы сервера):
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_stapling on;
#ssl_trusted_certificate /pfad/bundle.ca.pem;
ssl_stapling_verify on;
ssl_dhparam /etc/nginx/dhparams.pem;
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=31536000;preload;includeSubDomains" always;
TheQualys ssltest моих сайтовОднако не показывает, что я использую TLS 1.3 на своем сервере. Кроме того, браузер Chrome показывает, что он подключается через TLS 1.2. Даже если я удаляю директиву TLSv1.2
из своего ssl.conf
и оставляю только TLSv1.3
, он все равно подключается через TLS 1.2.
ssl_protocols
Нигде больше в других файлах конфигурации nginx нет такой директивы. Я проверил это через nginx -T
.
У меня действительно заканчиваются идеи... Может ли кто-нибудь мне помочь?
РЕДАКТИРОВАТЬ:
Почему-то nginx, похоже, не реагирует на ssl_protocols
и ssl_ecdh_curve
директиву должным образом. Например, когда я удаляю ssl_ciphers
из своей конфигурации (как @drookie предложил в своем комментарии), TLS 1.0 и TLS 1.1, похоже, поддерживаются моим сервером, хотя я установил ssl_protocols TLSv1.3 TLSv1.2;
. Аналогично, согласноQualys ssltest, secp256r1
поддерживается, хотя у меня нет этой кривой в моей конфигурации ssl_ecdh_curve
(ни prime256v1
). Мне кажется, что что-то перезаписывает мои настройки в ssl.conf
файле. Я использую acme.sh для получения сертификатов.
grep -R 'ssl_protocol' /etc/*
выдает только строку ssl.conf
с ssl_protocols TLSv1.3 TLSv1.2;
. Я понятия не имею, что может вызвать помехи/перезапись...
решение1
После многих дальнейших тестов и многого чтения я, наконец, нашел решение. Мне пришлось написать конфигурацию ssl в блоке http
, а не в server
блоках моей конфигурации nginx. Однако это сработало только если я скопировал директивы из моего ssl.conf
файла явно в http
блок в моем nginx.conf
(иначе nginx -t
выводится
nginx: [emerg] invalid number of arguments in "include" directive in /etc/nginx/nginx.conf:33
nginx: configuration file /etc/nginx/nginx.conf test failed
по какой-то причине).
Таким образом, мой http
блок nginx.conf
теперь выглядит следующим образом:
http {
...
ssl_dhparam /etc/nginx/dhparams.pem;
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
...
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Я не знаю, почему эти настройки SSL должны быть включены/вставлены в http
блок, а не в каждый server
блок... Но это работает, и TLS 1.3 включен!