nginx中应仅启用支持前向保密(pfs)和aead认证加密(如aes-gcm、chacha20-poly1305)的tls 1.2/1.3套件,禁用rc4、des、3des、md5、sha1等弱算法,并配合ssl_protocols、ssl_prefer_server_ciphers等指令确保配置生效。

在 Nginx 中合理配置 ssl_ciphers 是保障 HTTPS 通信安全的关键一步。简单地启用 TLS 并不等于安全,若允许弱加密套件(如含 RC4、MD5、SHA1、EXPORT、NULL、DES、3DES 的套件),攻击者可能通过降级、BEAST、POODLE 或 Sweet32 等漏洞窃取或篡改数据。最佳实践不是“尽量多开”,而是“精准保留强算法、明确排除已知风险项”。
明确目标:只保留前向保密 + AEAD 的现代套件
当前推荐的最小安全基线是:仅启用支持前向保密(PFS)且使用 AEAD 认证加密(如 AES-GCM、CHACHA20-POLY1305)的 TLS 1.2/1.3 套件。TLS 1.3 已移除所有不安全旧算法,因此优先启用 TLS 1.3,并为 TLS 1.2 提供严格筛选后的兼容套件。
- 必须禁用:
RC4、DES、3DES、MD5、SHA1(在签名和 PRF 中)、EXPORT、NULL、anon(匿名认证)、PSK(除非业务强依赖)、SRP - 强烈建议禁用:
CAMELLIA、SEED(非主流、审计少、硬件加速支持弱) - TLS 1.3 套件无需手动指定
ssl_ciphers,但需确保ssl_protocols TLSv1.2 TLSv1.3,其默认套件已是安全的
生产可用的 ssl_ciphers 配置示例
以下配置经 Mozilla SSL Configuration Generator(Intermediate profile)验证,兼顾安全性与主流客户端兼容性(支持 Chrome 70+、Firefox 63+、Safari 12+、Edge 79+):
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;说明:
- 全部以
ECDHE或DHE开头 → 强制前向保密 - 仅含
AES128-GCM、AES256-GCM、CHACHA20-POLY1305→ 全部为 AEAD 模式,无 CBC 类脆弱结构 - 不含
SHA1、MD5、RC4等关键词 → 显式规避已知缺陷 -
DHE套件保留是为了兼容部分仅支持 DHE 的旧系统(如某些嵌入式设备),若确定无此需求,可移除以提升性能
配合关键指令,避免配置被绕过
ssl_ciphers 单独设置不够,还需与其他指令协同生效:
-
必须启用 TLS 1.2 和 1.3:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/TLSv1.1) -
强制服务端密码套件优先级:
ssl_prefer_server_ciphers off;(Nginx 1.11.0+ 默认为 off;设为 on 会禁用 TLS 1.3,故应保持 off) -
启用 OCSP Stapling 提升证书校验效率与隐私:
ssl_stapling on; ssl_stapling_verify on; -
设置密钥交换参数强度:
ssl_dhparam /path/to/dhparam.pem;(使用至少 2048 位 DH 参数,推荐 3072 位;ECDHE 使用标准曲线如 X25519 或 P-256,无需额外配置)
验证与持续维护建议
配置后务必验证是否真正生效:
- 用
nginx -t && nginx -s reload检查语法并重载 - 使用 SSL Labs Test 扫描,重点关注 “Handshake Simulation” 中各客户端协商出的套件是否符合预期,且无红色警告(如弱密钥、不支持 PFS)
- 本地快速测试:
openssl s_client -connect example.com:443 -cipher 'ALL:COMPLEMENTOFALL' -tls1_2,再逐个尝试已禁用套件(如RC4-SHA)应返回 handshake failure - 订阅 CVE 与 Mozilla Root Store Policy 更新,当出现新漏洞(如 2023 年的
Keyless TLS实现缺陷)或算法弃用(如 NIST 宣布逐步淘汰 SHA-1 签名)时,及时调整










