Nginx 不支持仅强制 TLS 1.3,必须配置 ssl_protocols TLSv1.2 TLSv1.3 并限定原生 TLS 1.3 密码套件(如 TLS_AES_128_GCM_SHA256 等),同时确保 OpenSSL ≥1.1.1、Nginx ≥1.13.0,并禁用所有旧协议与弱算法,方可兼顾兼容性与安全性。

不能在 nginx.conf 中“强制”客户端只用 TLS 1.3——Nginx 不支持单协议硬隔离,强行只写 TLSv1.3 会导致 IE11、Android 4.4、旧版 Safari 等大量客户端连接失败。真正的做法是:**明确启用 TLS 1.2 + TLS 1.3,并禁用所有不安全旧协议,同时严格限定密码套件为 TLS 1.3 原生组合,从而在兼容前提下让现代客户端优先且稳定协商到 TLS 1.3。**
确认底层真实支持 TLS 1.3
配置前必须验证,否则一切无效:
- 运行
nginx -V 2>&1 | grep -i openssl,输出中必须含OpenSSL 1.1.1w或OpenSSL 3.0.13等 ≥1.1.1 版本;1.0.2或1.1.0均不支持 - 执行
openssl ciphers -v 'TLSv1.3',应至少列出TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256 - Nginx 版本需 ≥ 1.13.0(生产推荐 1.24.x),且非官方源低版本包(如 Ubuntu 20.04 默认 nginx 通常不带 TLS 1.3)
server 块内精准配置协议与套件
这些指令必须放在 server { ... } 块中(监听 443 端口),不可仅写在 http 块顶层:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 必须两者共存,避免老客户端断连 -
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;—— 仅这三组 RFC 8446 标准套件,严禁混入任何ECDHE-、RSA-或含SHA1的旧套件 -
ssl_prefer_server_ciphers off;—— TLS 1.3 下该指令已失效,显式关闭可防干扰 - 删除
ssl_ecdh_curve行(除非你有特殊曲线策略),TLS 1.3 自动协商 X25519 或 P-256
同步关闭不安全协议与算法
仅启用新协议不够,必须主动清除历史包袱:
-
ssl_protocols中不得出现TLSv1.0、TLSv1.1、SSLv2、SSLv3 - 检查并移除所有弱 cipher,如
RC4、3DES、AES128-SHA、ECDHE-RSA-AES256-SHA等 - 若使用 Certbot 自动生成配置,它常保留旧
ssl_ciphers行,务必手动替换为纯 TLS 1.3 套件
验证是否真正协商到 TLS 1.3
重载配置后必须实测,不能只看语法检查通过:
- 浏览器打开 DevTools → Security 标签页,查看 Connection 部分是否显示 “Protocol: TLS 1.3”
- 命令行测试:
openssl s_client -connect yourdomain.com:443 -tls1_3 2>/dev/null | grep Protocol,应输出Protocol : TLSv1.3 - 用 SSL Labs(https://www.ssllabs.com/ssltest/)扫描,确认 “Protocol Support” 显示 TLS 1.3 为绿色 ✔️,且无降级警告


















