Nginx提升SSL/TLS安全评级的核心是主动剔除弱算法、严格分层排序套件并协同配置ssl_protocols、ssl_prefer_server_ciphers等指令;仅堆砌强套件而未排除RC4、3DES、SHA1等将导致扫描仍报漏洞。

要让 Nginx 忽略弱密码套件、真正提升 SSL/TLS 安全评级(如 SSL Labs A+),核心不是“忽略”,而是**主动剔除 + 严格排序 + 协议协同**。配置失效的常见原因,往往是写了强套件却仍被扫描出 RC4、3DES、SHA1 等——这说明弱套件并未被真正移除,只是“没被优先选中”而已。
明确禁用所有已知弱算法
在 ssl_ciphers 中使用排除语法,比堆砌强套件更可靠、更易维护:
- 直接写:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; - 或等效排除式:
ssl_ciphers HIGH:!aNULL:!MD5:!RC4:!3DES:!DES:!EXPORT:!SHA1:!DSS; -
必须包含:
!RC4、!3DES、!DES、!SHA1、!MD5—— 这些是等保、CIS 和 PCI DSS 明确要求禁用项 - 避免混用宏与具体套件(如
HIGH:ECDHE-RSA-AES128-GCM-SHA256:!RC4),OpenSSL 解析顺序可能导致弱套件意外保留
按 TLS 版本分层排序,确保 TLS 1.3 优先生效
TLS 1.3 和 TLS 1.2 套件机制完全不同,混排会引发静默降级或握手变慢:
- TLS 1.3 套件必须前置,且仅用标准前缀:
TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256 - TLS 1.2 套件紧随其后,限定为 ECDHE + AEAD 组合(AES-GCM / ChaCha20)
- 绝对不要穿插
DHE、CBC模式(如AES256-SHA)或SHA1套件——它们不仅弱,还会拖慢协商 - 完整示例:
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
配套关键指令,堵住协商漏洞
只改 ssl_ciphers 不够,必须同步收紧其他环节:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 显式启用,不写TLSv1.0或TLSv1.1,也不留空 -
ssl_prefer_server_ciphers on;—— 对 TLS 1.2 至关重要,强制服务端按你写的顺序匹配;注意:该指令对 TLS 1.3 无影响,不会禁用它 -
ssl_ecdh_curve secp384r1:prime256v1;—— 避免客户端 fallback 到低效或不安全曲线 -
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;—— 减少重复握手开销 -
ssl_stapling on; ssl_stapling_verify on;—— 启用 OCSP Stapling,加快证书状态验证
验证是否真正生效,而非仅语法通过
重载 Nginx 成功 ≠ 安全达标。必须实测协商结果:
- 用
nmap --script ssl-enum-ciphers -p 443 your-domain.com扫描,确认输出中完全不出现RC4、3DES、DES、SHA1、CBC、TLS_RSA_等关键词 - 用 SSL Labs Server Test 查评级,目标为 A+;若显示 “Weak cipher suites supported”,说明配置未生效
- 浏览器打开 DevTools → Security 标签页,查看实际协商套件:TLS 1.3 应为
TLS_AES_128_GCM_SHA256类,TLS 1.2 应为ECDHE-RSA-AES128-GCM-SHA256类 - 若仍看到
AES128-CBC-SHA或TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,说明配置被覆盖(如 http 块里有旧配置、子 server 块未继承、或 CDN 层未同步)











