ssl_protocols TLSv1.2 TLSv1.3;是Nginx SSL安全基石,必须禁用已废弃的SSLv2/3、TLSv1.0/1.1以杜绝POODLE、BEAST等攻击,仅启用TLSv1.2(兼容主流设备)和TLSv1.3(更快更安全、强制前向保密),需OpenSSL 1.1.1+支持,并在http或server块中配置,通过openssl命令和SSL Labs实测验证。

Nginx 配置 SSL 后,`ssl_protocols` 是第一道安全防线。它不负责加密细节,但直接决定客户端能否用不安全的老协议连上来——哪怕只开一个 TLS 1.1,整个站点在 SSL Labs 测评中就可能掉到 B 级甚至更低。
必须禁用的协议版本
SSLv2、SSLv3、TLSv1.0 和 TLSv1.1 已被 IETF 正式废弃(RFC 8996),存在可利用漏洞:
- SSLv3:POODLE 攻击可解密 HTTPS 流量
- TLSv1.0/1.1:BEAST、CRIME、Lucky13 等攻击链成熟,且不支持前向保密(PFS)强制机制
这些协议在现代浏览器中早已默认禁用,保留它们只会给自动化扫描器留下明确攻击入口,毫无兼容性收益。
推荐启用的协议组合
当前唯一合理的选择是:
ssl_protocols TLSv1.2 TLSv1.3;- TLSv1.2:仍是兼容性基石,覆盖所有主流设备(包括 Windows 7 IE11、Android 4.4+、iOS 9+),只要配对强加密套件(如 ECDHE+AES-GCM),安全性完全达标
- TLSv1.3:握手更快(1-RTT)、移除 RSA 密钥交换和 CBC 模式等高危组件、强制前向保密,且不兼容降级攻击。需 OpenSSL 1.1.1+ 和 Nginx 1.13.0+,CentOS 7/Debian 10+ 默认满足
不要写成 TLsv1、TLSv1.2+ 或混入 TLSv1.1 ——Nginx 会静默忽略错误写法或降低整体安全评级。
配置位置与生效逻辑
ssl_protocols 只在 http 或 server 块中有效,location 块里设置无效。
- 放在
http块:统一约束所有 HTTPS server,适合单证书或多域名共用策略 - 放在
server块:精细化控制,例如对内网 API 严格只开 TLSv1.3,对外网站保留 TLSv1.2 兼容
子 server 会继承 http 块的设置,除非显式重写。建议优先在 http 块定义,避免遗漏。
验证是否真正生效
重启 Nginx 后,不能只看配置文件有没有写错,要实测:
- 用 OpenSSL 手动探测:
openssl s_client -connect example.com:443 -tls1_1→ 应失败(Connection refused 或 handshake error)openssl s_client -connect example.com:443 -tls1_2→ 应成功并显示协议版本openssl s_client -connect example.com:443 -tls1_3→ 同样应成功 - 用 SSL Labs Server Test 扫描域名,查看“Protocol Support”栏是否仅显示 TLS 1.2 和 TLS 1.3,且评级为 A 或 A+
- 检查 Nginx 错误日志:
nginx -t若拼写错误(如 TLSv1.22),会报invalid value











