我在 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_protocols
andssl_ecdh_curve
指令做出反应。例如,当我ssl_ciphers
从我的配置中删除 (正如@drookie 在他的评论中建议的那样)时,我的服务器似乎支持 TLS 1.0 和 TLS 1.1,尽管我设置了ssl_protocols TLSv1.3 TLSv1.2;
. 同样,根据Qualys ssltest,secp256r1
虽然我的ssl_ecdh_curve
(nor prime256v1
) 配置中没有这条曲线,但它是受支持的。在我看来,好像有什么东西覆盖了我在ssl.conf
文件中的设置。我正在使用 acme.sh 来获取我的证书。
grep -R 'ssl_protocol' /etc/*
只ssl.conf
用ssl_protocols TLSv1.3 TLSv1.2;
. 我不知道什么会导致干扰/覆盖......
经过多次进一步的测试和阅读,我终于找到了解决方案。我必须在块中编写 ssl 配置
http
,而不是在server
我的 nginx 配置块中。但是,只有当我将ssl.conf
文件中的指令显式复制到我的http
块中nginx.conf
(否则nginx -t
输出由于某些原因)。
因此,我现在
http
的nginx.conf
外观如下:我不知道为什么必须在
http
块中而不是在每个server
块中包含/粘贴这些 ssl 设置.....但是它可以工作并且启用了 TLS 1.3!