У меня есть 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;

Однако Qualys ssltest моих сайтов не показывает, что я использую TLS 1.3 на своем сервере. Кроме того, браузер Chrome показывает, что он подключается через TLS 1.2. Даже если я уберу TLSv1.2директиву из моего ssl.confи оставлю только TLSv1.3, он все равно подключается через TLS 1.2.

ssl_protocolsНи в одном другом конфигурационном файле nginx нет такой директивы. Я проверил это через nginx -T.

У меня действительно заканчиваются идеи..... Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ: Почему-то nginx, похоже, не реагирует на директиву ssl_protocolsand должным образом. 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;. Я понятия не имею, что может вызвать помехи/перезапись...

answer

После многих дальнейших тестов и большого чтения я наконец нашел решение. Мне пришлось писать конфигурацию 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 включен!