必须在每个启用 HTTPS 的 server 块中显式配置 ssl_protocols TLSv1.2 TLSv1.3; 并搭配强加密套件与 ssl_prefer_server_ciphers on;,才能彻底禁用旧协议和弱算法,且需实测验证。

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,就能彻底禁用 SSLv2、SSLv3、TLSv1.0 和 TLSv1.1 ——Nginx 不会协商未列出的协议,不支持即握手失败,不存在降级可能。
必须放在 server 块里才生效
该指令仅在带 listen 443 ssl 的 server { } 内部有效。写在 http 或 location 块中,语法能通过,但实际完全不生效。
- 若配置了多个域名或虚拟主机(如
sites-enabled/下多个文件),每个server块都得单独加这一行 - Nginx 不继承父级 SSL 协议设置,不能靠“一次配置全局生效”
- 确保该行紧跟在
ssl_certificate和ssl_certificate_key之后,位置清晰
只留 TLSv1.2 和 TLSv1.3,写法要精准
必须显式、完整、无歧义地只声明这两个版本,大小写、空格、分号都不能错:
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3; - ❌ 错误:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(TLSv1等价于 TLSv1.0) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配符) - ❌ 错误:
ssl_protocols all;或留空(旧版 Nginx 默认含 TLSv1.0,风险不可控)
光禁协议不够,还得收紧加密套件
即使协议被限制,客户端仍可能协商出弱 cipher,导致前向保密缺失或易受攻击。需同步配置:
- 明确禁用含 RC4、MD5、SHA1、DES、3DES 的所有套件
- 推荐 cipher 配置:
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; - 启用服务端优先:
ssl_prefer_server_ciphers on;,防止客户端绕过策略选弱算法
改完必须实测验证
不能只靠 nginx -t,要真实触发握手测试:
- 验证 TLSv1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com→ 应返回握手失败 - 验证 TLSv1.2 是否可用 → 输出中应显示
Protocol : TLSv1.2且无错误 - 可配合 SSL Labs(ssllabs.com)做全量扫描,确认评级达到 A 或 A+


















