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

在 Nginx 中禁用 TLS 1.0 和 TLS 1.1,核心就一句话:每个启用 HTTPS 的 server 块里,必须明确写上 ssl_protocols TLSv1.2 TLSv1.3;。这不是可选项,而是当前所有主流安全标准(PCI DSS、等保2.0、NIST SP 800-52r2)的硬性要求。
配置位置不能错
这条指令只在 server 块内生效,写在 http 或 location 块中完全无效——即使 nginx -t 检查通过,旧协议仍可能被协商成功。
- 每个监听
443 ssl的server块都得单独加这一行 - 多个域名或虚拟主机(比如
/etc/nginx/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 不支持通配符) - ❌ 错误:
ssl_protocols TLSv1.2 TLSv1.3(漏掉分号,重载失败)
光禁协议远远不够
只限制协议版本,无法阻止客户端用弱加密套件建立 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。必须用工具确认旧协议是否真被拒绝:
- 测试 TLS 1.1 是否被拒:
openssl s_client -connect example.com:443 -tls1_1 -servername example.com
应返回握手失败或连接重置 - 测试 TLS 1.2 是否可用:
openssl s_client -connect example.com:443 -tls1_2 -servername example.com
应成功完成握手并显示证书信息 - 用
nmap --script ssl-enum-ciphers -p 443 example.com查看完整支持列表,确认输出中无 TLSv1.0/TLSv1.1 区块 - 访问 SSL Labs Test,检查 “Protocol Support” 部分是否仅显示 TLS 1.2 和 TLS 1.3











