Nginx

TLS 1.3 不適用於帶有 openssl 1.1.1n 的 nginx 1.21

  • April 6, 2022

我在 Debian 11 伺服器上使用 openssl 1.1.1n 執行 nginx (1.21.6)。儘管我遵循了許多教程並查看了該論壇中有關此主題的多個問題,但我無法使 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從 my 中刪除指令ssl.conf並僅離開TLSv1.3,它仍然通過 TLS 1.2 連接。

nginx 的任何其他配置文件中都沒有其他ssl_protocols指令。我通過nginx -T.

我真的沒有想法了…..有人可以幫助我嗎?

編輯: 不知何故,nginx 似乎沒有正確地對ssl_protocolsandssl_ecdh_curve指令做出反應。例如,當我ssl_ciphers從我的配置中刪除 (正如@drookie 在他的評論中建議的那樣)時,我的伺服器似乎支持 TLS 1.0 和 TLS 1.1,儘管我設置了ssl_protocols TLSv1.3 TLSv1.2;. 同樣,根據Qualys ssltestsecp256r1雖然我的ssl_ecdh_curve(nor prime256v1) 配置中沒有這條曲線,但它是受支持的。在我看來,好像有什麼東西覆蓋了我在ssl.conf文件中的設置。我正在使用 acme.sh 來獲取我的證書。 grep -R 'ssl_protocol' /etc/*ssl.confssl_protocols TLSv1.3 TLSv1.2;. 我不知道什麼會導致干擾/覆蓋……

經過多次進一步的測試和閱讀,我終於找到了解決方案。我必須在塊中編寫 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

由於某些原因)。

因此,我現在httpnginx.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/*;
}

我不知道為什麼必須在http塊中而不是在每個server塊中包含/粘貼這些 ssl 設置…..但是它可以工作並且啟用了 TLS 1.3!

引用自:https://serverfault.com/questions/1097716