必须在每个启用 https 的 server 块中配置 ssl_protocols tlsv1.2 tlsv1.3;,才能精准禁用 sslv2/sslv3/tlsv1.0/tlsv1.1;该指令在 http 或 location 块中无效,且须配合强加密套件、ssl_prefer_server_ciphers on 及实测验证。

直接在每个启用 HTTPS 的 server 块里写 ssl_protocols TLSv1.2 TLSv1.3;,就能真正控制该站点实际协商的协议版本。这个指令必须放在 server 块内,写在 http 或 location 里无效——哪怕语法检查通过,Nginx 也不会执行。
必须逐个 server 块配置
如果你有多个域名或虚拟主机(比如多个 sites-enabled/*.conf),每个监听 443 ssl 的 server 都要单独加上这一行。漏掉一个,那个站点就仍可能接受 TLSv1.0/TLSv1.1。
写法要严格准确
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3;(空格分隔、大小写敏感、末尾分号) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配符) - ❌ 错误:
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;(含 TLSv1.1 就等于没禁) - ❌ 错误:
ssl_protocols TLSv12;(拼写错误,Nginx 无法识别)
配合加密套件才真正安全
光限制协议不够,还得同步配置强 cipher 和服务端优先:
-
ssl_ciphers排除 RC4、MD5、SHA1、DES、3DES;推荐包含ECDHE前向保密算法 -
ssl_prefer_server_ciphers on;确保客户端不能绕过你的 cipher 顺序选弱项
验证是否生效
- 手动测试:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com应失败(返回连接关闭或 handshake error) -
openssl s_client -connect example.com:443 -tls1_2和-tls1_3应成功并显示对应协议 - 用 SSL Labs 测试报告确认协议支持列表和评级
不复杂但容易忽略。











