nginx启用tls 1.3需同时满足三条件:openssl≥1.1.1且nginx编译链接该版本、server块中配置ssl_protocols tlsv1.2 tlsv1.3、ssl_ciphers仅用tls 1.3原生套件,缺一不可。

要让 Nginx 真正启用 TLS 1.3,不能只改一行配置。它依赖底层组件支持、显式启用协议、匹配专用密码套件,三者缺一不可。否则浏览器可能静默降级到 TLS 1.2,你完全察觉不到。
确认运行环境是否真正支持
很多人以为装了新版 nginx 就行,其实关键在编译时链接的 OpenSSL 版本。执行以下命令:
nginx -V 2>&1 | grep -i "openssl\|built with"
输出中必须同时包含:
- nginx 版本 ≥ 1.14.0(推荐)
- built with OpenSSL 1.1.1 或更高(如 1.1.1w、3.0.13)
若显示 OpenSSL 1.0.2 或 1.1.0,哪怕 nginx 是 1.24,TLS 1.3 也无效。Ubuntu/Debian 用户建议添加 ppa:ondrej/nginx;CentOS/RHEL 7 需手动编译或启用 EPEL + nginx-mainline 仓库。
修改 server 块中的 SSL 配置项
该配置必须放在 listen 443 ssl 的 server 块内,不能只写在 http 块顶层:
- ssl_protocols TLSv1.2 TLSv1.3; —— 必须显式列出,不能只写 TLSv1.3(否则老客户端断连)
- ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'; —— 只能用这三组 TLS 1.3 原生套件,混入 ECDHE-RSA 等旧套件会导致协商失败
- ssl_prefer_server_ciphers off; —— TLS 1.3 下该指令已废弃,设为 on 反而干扰协商
- 删除 ssl_ecdh_curve 行(除非你明确限定曲线),TLS 1.3 自动协商 X25519 或 P-256
验证配置是否生效
完成修改后执行:
nginx -t && nginx -s reload
然后用真实终端测试:
- curl -I --tlsv1.3 https://your-domain.com(返回 200 且无报错)
- 用 Chrome 浏览器打开 devtools → Security 标签页,查看连接详细信息中 Protocol 是否显示 “TLS 1.3”
- 在线工具如 SSL Labs Test 可完整检测协议支持与密码套件协商结果
注意:Let’s Encrypt 证书、RSA 或 ECC 类型均可直接使用,无需更换证书。











