必须在每个https server块中配置ssl_protocols tlsv1.2 tlsv1.3;并搭配强加密套件、ssl_prefer_server_ciphers on;及实测验证,才能彻底禁用sslv3、tlsv1.0和tlsv1.1,满足pci dss等合规硬性要求。

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,就能彻底禁用 SSLv3、TLSv1.0 和 TLSv1.1。这不是可选优化,而是当前所有主流安全标准(PCI DSS、等保2.0、NIST SP 800-52r2)的硬性要求。
必须在每个 server 块里单独配置
该指令只在 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(漏掉分号,重载失败)
光禁协议不够,必须同步收紧加密套件
即使协议被限制为 TLSv1.2/TLSv1.3,若仍允许弱套件(如 AES128-SHA、3DES、RC4),攻击者仍可建立易受攻击的连接。
- 显式声明强套件,例如:
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"; - 禁用含 RC4、MD5、SHA1、DES、3DES 的所有套件
- 启用服务端优先:
ssl_prefer_server_ciphers on;,防止客户端绕过策略选弱算法
改完必须实测验证,不能只信配置文件
配置重载后,必须用工具确认旧协议是否真被拒绝、强套件是否真正生效。
- 测试 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











