
我在 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 連接。
ssl_protocols
nginx 的任何其他設定檔中都沒有其他指令。我透過nginx -T
.
我真的沒有主意了......有人可以幫助我嗎?
編輯:
不知何故,nginx 似乎沒有對ssl_protocols
和ssl_ecdh_curve
指令做出正確的反應。例如,當我從配置中刪除 時ssl_ciphers
(正如 @drookie 在他的評論中建議的那樣),儘管我設定了ssl_protocols TLSv1.3 TLSv1.2;
.同樣,根據品質安全測試,受支持,儘管我的(nor )secp256r1
配置中沒有這條曲線。在我看來,好像有什麼東西覆蓋了我在文件中的設定。我正在使用 acme.sh 來獲取我的憑證。 只給出了with中的行。我不知道什麼會導致幹擾/覆蓋......ssl_ecdh_curve
prime256v1
ssl.conf
grep -R 'ssl_protocol' /etc/*
ssl.conf
ssl_protocols TLSv1.3 TLSv1.2;
答案1
經過多次進一步的測試和大量閱讀,我終於找到了解決方案。我必須在http
區塊中編寫 ssl 配置,而不是在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!