必须在每个https server块中配置ssl_protocols tlsv1.2 tlsv1.3;并显式声明强加密套件(如ecdhe-aes-gcm/chacha20-poly1305),启用ssl_prefer_server_ciphers on;,且逐站实测验证,才能满足pci dss等合规硬性要求。

直接在每个启用 HTTPS 的 server 块中写入 ssl_protocols TLSv1.2 TLSv1.3;,并搭配显式声明的强加密套件,就能完成协议禁用与密码加固——这不是可选优化,而是当前所有主流合规标准(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 协议设置,不存在“全局配置一次就全生效”
协议版本必须精准列举,一个都不能多
只写你真正支持的版本,等于主动排除所有不安全协议:SSLv2、SSLv3、TLSv1.0、TLSv1.1。
- ✅ 正确:
ssl_protocols TLSv1.2 TLSv1.3; - ❌ 错误:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;(显式包含即允许降级) - ❌ 错误:
ssl_protocols TLSv1.2+;(Nginx 不支持通配符) - ❌ 错误:漏掉分号、大小写错误、多余空格
加密套件要用白名单式精简声明
禁用弱算法不能靠黑名单(比如 !RC4:!MD5),容易遗漏且 OpenSSL 解析行为不可控。必须显式列出真正安全的套件。
- 全部套件需满足:ECDHE 密钥交换、AES-GCM 或 ChaCha20-Poly1305 认证加密、密钥长度 ≥128 位
- 推荐配置:
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"; - 必须启用服务端优先:
ssl_prefer_server_ciphers on;,防止客户端绕过策略选弱算法
改完一定要实测验证,不能只信配置文件
重载后必须用工具确认旧协议是否真被拒绝、强套件是否真正生效。
- 测试 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→ 应成功完成握手并显示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











