直接在每个启用 HTTPS 的 server 块中配置 ssl_protocols TLSv1.2 TLSv1.3; 即可彻底禁用 SSLv3、TLSv1.0 和 TLSv1.1,该指令仅在 server 块生效,须配合强加密套件、ssl_prefer_server_ciphers on 及实测验证。

必须放在 server 块内,不能放错位置
这个指令只在 `server { ... }` 块中生效,写在 `http` 或 `location` 块里语法可能通过,但实际完全无效。
- 每个监听 `443 ssl` 的 `server` 块都要单独加这一行
- 多个域名、多站点(如 `/etc/nginx/sites-enabled/` 下多个 conf 文件)?每个文件里的对应 `server` 都得配
- Nginx 不继承父级设置,不存在“全局配置一次就全生效”的情况
写法必须精准,一个字符都不能错
协议列表要明确、排他,不能含糊或留缝隙:
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3; - ❌ 错误:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(显式包含旧版 = 允许降级) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配写法) - ❌ 错误:漏分号、大小写错误(如
tlsv1.2)、多余空格
光禁协议不够,还得收紧加密套件
即使协议被限制为 TLSv1.2/TLSv1.3,客户端仍可能协商出弱 cipher,导致前向保密缺失或易受攻击。
- 禁用所有含 RC4、MD5、SHA1、DES、3DES 的套件
- 优先选用 ECDHE 密钥交换 + AES-GCM 组合,例如:
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
应返回握手失败或 connection refused - 测试 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 区块


















