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

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,就能强制禁用 TLS 1.0 和 TLS 1.1。这不是优化项,而是当前安全基线的硬性要求。
必须放在 server 块内,不能省略或放错位置
ssl_protocols 指令只在 server 块中生效,写在 http 或 location 块里完全无效。即使语法检查通过,旧协议仍可能被协商成功。
- 每个监听 443 端口并启用 SSL 的
server块都必须单独配置,Nginx 不继承父级设置 - 若使用多个域名或虚拟主机(如
/etc/nginx/sites-enabled/下多个 conf 文件),每个文件里的对应server块都要加这一行 - 配置示例(关键行已标出):
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
}
只保留两个版本,避免任何降级可能
明确列出 TLSv1.2 TLSv1.3,等于主动排除所有不安全协议:SSLv2、SSLv3、TLSv1、TLSv1.1。这些旧版本存在 POODLE、BEAST 等已知漏洞,且不满足 PCI DSS、等保2.0、GDPR 等合规要求。
- ❌ 错误写法:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(多一个旧版本就可能触发降级) - ❌ 错误写法:
ssl_protocols TLSv1.2+;或漏掉分号、大小写错误、多余空格 - ✅ 正确效果:不支持 TLS 1.2 的老旧客户端(如 IE11 on Windows 7)将无法建立连接——这是预期结果,不是故障
必须配合强加密套件与服务端优先策略
仅限制协议不够。客户端仍可能用弱算法建立 TLS 1.2 连接,导致前向保密缺失或易受攻击。
- 指定高安全性密钥交换与认证方式:
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 && nginx -s reload,再用工具实测,否则无法确认是否拦截成功。
- 测试 TLS 1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败或 connection refused - 测试 TLS 1.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 免费扫描,查看 “Protocol Support” 栏是否仅显示 TLS 1.2 和 TLS 1.3,评级达 A 或 A+











