要在 Nginx 中真正启用 TLS 1.3,必须同时满足 OpenSSL 1.1.1+ 编译支持、server 块中配置 ssl_protocols TLSv1.2 TLSv1.3、专用 TLS 1.3 密码套件、OCSP Stapling 等加固项,缺一不可。

要在 Nginx 中真正启用 TLS 1.3,不能只加一行 ssl_protocols TLSv1.3。它需要底层 OpenSSL 支持、协议声明、专用密码套件和配套加固四者同时到位,缺一不可。
确认运行环境真实支持 TLS 1.3
很多问题出在“以为支持,其实不支持”。关键看 Nginx 编译时绑定的 OpenSSL 版本,而不是系统命令行里装的那个:
- 执行
nginx -V 2>&1 | grep -i openssl,输出中必须含 OpenSSL 1.1.1(如 1.1.1w)或 OpenSSL 3.0+(如 3.0.13);1.0.2 或 1.1.0 均无效 - 运行
openssl ciphers -v 'TLSv1.3',应至少输出三条套件:TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_AES_128_GCM_SHA256 - Nginx 版本需 ≥ 1.13.0,生产环境推荐 ≥ 1.16.0 或 1.24.x;若为源码编译,需含
--with-openssl-opt=enable-tls1_3
在 server 块中精准配置协议与套件
仅写 ssl_protocols TLSv1.3 会导致老客户端(如 IE11、Android 4.4)直接断连;混入 TLS 1.2 套件则可能静默降级或握手失败:
- 兼容性写法:
ssl_protocols TLSv1.2 TLSv1.3;(必须包含 TLSv1.2) - 仅使用 TLS 1.3 原生套件,且不能混入任何非
TLS_开头的套件:ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256; - 显式关闭已失效指令:
ssl_prefer_server_ciphers off; - 该配置必须放在
server块内(监听 443 端口),不能只写在http块顶层
启用关键加固机制
TLS 1.3 本身不解决证书吊销验证延迟、中间人降级等问题,以下配置必须同步启用:
-
OCSP Stapling:减少握手延迟,防隐私泄露
ssl_stapling on;<br> ssl_stapling_verify on;<br> resolver 8.8.8.8 1.1.1.1 valid=300s;<br> resolver_timeout 5s;<br> ssl_trusted_certificate /path/to/fullchain.pem;
-
HSTS:强制 HTTPS,防协议降级
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; -
会话票据与曲线优化:支撑 0-RTT 并提升前向安全
ssl_session_tickets on;<br> ssl_session_timeout 1d;<br> ssl_ecdh_curve X25519:secp384r1;
验证是否真正生效
配置重载后,务必实测,不能只看语法无报错:
- 用 OpenSSL 测试:
openssl s_client -connect example.com:443 -tls1_3 -servername example.com 2>/dev/null | grep "Protocol",应返回Protocol : TLSv1.3 - 浏览器访问后点击地址栏锁图标,查看连接详细信息,确认协议显示为 TLS 1.3
- 使用在线工具(如 SSL Labs 的 SSL Test)扫描,检查协议支持、密钥交换、证书链及 OCSP Stapling 是否全部通过


















