nginx仅支持ssl密码套件白名单机制,需通过ssl_ciphers明确指定强套件并配合ssl_protocols、ssl_prefer_server_ciphers、ssl_ecdh_curve三项指令共同生效,禁用rc4、3des等弱算法及非pfs、非aead套件。

Nginx 不支持“SSL 密码套件黑名单”机制,它只有白名单模式:通过 ssl_ciphers 明确列出允许使用的套件,未列出的自动被拒绝。所谓“黑名单”是误解——你无法写“禁用 RC4”,只能写“只保留不含 RC4 的强套件”。
真正安全的做法,是用一组经过筛选的、高安全等级的密码套件,从源头排除所有已知风险算法。
✅ 正确配置强密码套件(白名单)
在 server 块中直接设置,确保只启用前向保密(PFS)、AEAD 加密、密钥长度 ≥128 位的套件:
ssl_ciphers 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-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';
这个列表已剔除:
- 所有含
RC4、3DES、DES、MD5、SHA1的套件 - 所有静态 RSA 密钥交换(无 PFS)
- 所有非 AEAD 模式(如 CBC 类 SHA256 套件虽比 SHA1 强,但不如 GCM/Poly1305)
⚙️ 必须配套的三项指令
仅设 ssl_ciphers 不够,以下三者必须同时存在且位置正确(都在 server 块内):
ssl_protocols TLSv1.2 TLSv1.3;
(禁止 TLSv1.0/v1.1,它们允许弱协商路径)ssl_prefer_server_ciphers on;
(否则客户端可绕过你的白名单,强行选它支持的最弱可用套件)ssl_ecdh_curve secp384r1:prime256v1;
(提升 ECDHE 性能与抗侧信道能力;国密场景则用sm2p256v1)
❌ 常见错误要避开
- 把
ssl_ciphers写在http或location块里 → 无效 - 混用 TLS 版本(如
TLSv1.2+)或漏写分号 → 配置失败 - 未配
ssl_prefer_server_ciphers on→ 白名单形同虚设 - 在多个
server块中遗漏ssl_protocols→ 某些域名仍可能降级
? 验证是否生效
重启后执行:
openssl s_client -connect yourdomain.com:443 -cipher 'RC4' -tls1_2 2>/dev/null | grep "Cipher is"
应返回空(表示 RC4 被拒);
再试强套件:
openssl s_client -connect yourdomain.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' -tls1_2 2>/dev/null | grep "Cipher is"
应显示具体套件名,说明协商成功。
不复杂但容易忽略











