开启 ssl_ciphers 精准配置是 nginx 抵御 tls 降级攻击最直接有效的手段,通过剔除 rc4、des/3des、md5/sha1、export、null 等弱算法,并采用 tls1.3 优先、ecdhe+aead 的强套件结构,配合 ssl_protocols、ssl_prefer_server_ciphers 等指令协同生效。

开启 ssl_ciphers 的精准配置,是 Nginx 抵御 TLS 降级攻击最直接、最有效的手段之一。它不靠堵漏洞,而是从握手协商源头切断攻击者诱使客户端退回到弱算法的路径。
为什么 ssl_ciphers 配置能阻断降级攻击
中间人攻击者常在 TLS 握手阶段篡改 ClientHello 中的 cipher list,或响应 ServerHello 时故意忽略强套件,诱导服务端选择老旧组合(如 TLSv1.0 + RC4 或 SHA1 签名的 CBC 套件)。Nginx 默认按客户端偏好协商;若服务端 ssl_ciphers 列表里混入了已被淘汰的算法,就等于为降级留了后门。
只要把弱算法彻底剔除,并确保强套件顺序合理,攻击者即使干扰协商过程,也无法让服务端“有得可选”——没有 RC4,就无法降级到 RC4;没有 TLSv1.1,就根本不会进入该协议栈。
必须禁用的弱算法关键词
以下字符串一旦出现在 ssl_ciphers 中,即构成降级风险点,应全部清除:
-
RC4(如
RC4-SHA)——易受 Bar Mitzvah 攻击,主流浏览器已弃用 -
DES / 3DES(如
DES-CBC-SHA、3DES-EDE-CBC-SHA)——密钥强度不足,存在 Sweet32 碰撞风险 -
MD5 / SHA1(如含
-MD5、-SHA的非 AEAD 套件)——哈希碰撞漏洞明确,等保与 PCI DSS 均禁止 -
EXPORT(如
EXP-EDH-RSA-DES-CBC-SHA)——密钥长度低于 40 位,法律层面不可接受 -
NULL / ANONYMOUS / STATIC RSA(如
RSA-AES256-SHA)——无前向保密,会话密钥可被长期解密
推荐的安全套件结构(兼顾 TLS 1.2 与 TLS 1.3)
现代生产环境应采用分层写法:TLS 1.3 套件前置,TLS 1.2 套件紧随其后,全部限定为 ECDHE/DHE + AEAD 模式:
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';
说明:
- TLS 1.3 套件放最前,确保支持该协议的客户端直接命中,不走协商流程
- TLS 1.2 套件全部基于
ECDHE或DHE,强制前向保密(PFS) - 加密部分仅用
AES-GCM或CHACHA20-POLY1305,杜绝 CBC 模式及 Lucky13 类侧信道风险 - 不依赖
!aNULL:!MD5这类黑名单语法——OpenSSL 新版本默认已禁用,显式写出反而干扰维护
配套指令缺一不可
ssl_ciphers 单独生效无效,必须与以下配置协同:
-
严格限制协议版本:
ssl_protocols TLSv1.2 TLSv1.3;——禁用 TLSv1.0/TLSv1.1,避免协议层降级入口 -
启用服务端优先权:
ssl_prefer_server_ciphers on;——让 Nginx 强制按自己列表顺序匹配,无视客户端弱偏好(注意:对 TLS 1.3 无效,但对 TLS 1.2 至关重要) -
优化密钥交换性能:
ssl_ecdh_curve secp384r1:prime256v1;——防止 fallback 到低效软件曲线,保障 ECDHE 快速完成 - 叠加 HSTS 与 OCSP Stapling:前者封死 HTTP 明文入口,后者防止攻击者伪造吊销状态绕过证书检查











