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

直接在每个启用 HTTPS 的 server 块内配置 ssl_protocols TLSv1.2 TLSv1.3;,就能有效禁用 SSLv2、SSLv3、TLSv1.0 和 TLSv1.1。这不是可选优化,而是当前安全基线的硬性要求。
必须放在 server 块里才生效
该指令不能写在 http 或 location 块中——语法可能通过,但实际完全不生效。正确位置是:
- 每个带
listen 443 ssl的server { }块内部 - 若存在多个域名或虚拟主机(如多个
sites-enabled/*.conf),每个server都要单独添加这一行 - 不能依赖继承,Nginx 不会从父级自动获取 SSL 协议设置
只留两个版本,明确排除所有旧协议
写法必须精准,大小写、空格、分号都不能出错:
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3; - ❌ 错误:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(多一个旧版本就可能允许降级) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配写法) - ⚠️ 注意:TLSv1.0/TLSv1.1 已被 PCI DSS、等保2.0、NIST SP 800-52r2 等标准明令弃用
光禁协议不够,必须同步收紧加密套件
即使协议受限,客户端仍可能协商出弱 cipher 导致前向保密缺失或易受攻击。需配套配置:
- 指定强密钥交换与认证方式:
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; - 禁用含 RC4、MD5、SHA1、DES、3DES 的所有套件
- 启用服务端优先:
ssl_prefer_server_ciphers on;(防止客户端绕过服务器策略选弱算法)
验证是否真正禁用成功
改完配置后必须实测,不能只靠 nginx -t:
- 测试 TLSv1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败 - 测试 TLSv1.2 是否可用:
openssl s_client -connect example.com:443 -tls1_2 -servername example.com→ 输出中应显示Protocol : TLSv1.2 - 用
nmap --script ssl-enum-ciphers -p 443 example.com查看完整支持列表,确认无 TLSv1.0/TLSv1.1 区块 - 访问 SSL Labs Test,检查 “Protocol Support” 部分是否仅显示 TLS 1.2 和 TLS 1.3
不复杂但容易忽略











