ssl_prefer_server_ciphers on 本身不能单独防御降级攻击,必须与禁用tlsv1.0/1.1、精简强加密套件(如ecdhe+aes-gcm)、启用hsts及ocsp stapling等措施协同构成安全闭环。

开启 ssl_prefer_server_ciphers on 是防御中间人协议降级攻击的关键一环,但单独启用它几乎无效——必须与协议限制、密钥交换方式、加密套件排序共同构成闭环策略。
为什么这个指令能对抗降级攻击
中间人攻击者常在 TLS 握手阶段干扰协商过程,诱使客户端和服务器退回到老旧、不安全的加密组合(如 TLSv1.0 + RC4 或 SSLv3 + EXPORT 套件)。默认情况下,Nginx 会尊重客户端提出的 cipher list 顺序,可能被动接受弱算法。
开启该指令后,Nginx 强制以自己配置的 ssl_ciphers 顺序为准,忽略客户端偏好。只要服务端列表里不含已淘汰算法,就能从源头阻断降级路径。
必须同步落实的三项硬性配置
-
禁用过时协议版本:只保留 TLSv1.2 和 TLSv1.3。
写法:ssl_protocols TLSv1.2 TLSv1.3;
不能多写 TLSv1.0 或 TLSv1.1,哪怕带空格也会导致 nginx 启动失败;TLSv1.3 下该指令自动失效,所以它的价值集中在 TLSv1.2 场景。 -
精简并加固 cipher list:剔除所有已知脆弱算法(RC4、DES、3DES、MD5、SHA1、EXPORT),只保留前向保密(PFS)优先的现代组合。
推荐示例: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 -
启用 ECDHE 曲线协商优化:配合
ssl_ecdh_curve secp384r1:prime256v1;提升密钥交换性能与兼容性,避免 fallback 到非 PFS 的 RSA 密钥交换。
配套防护不可省略
仅靠 cipher 控制仍存在旁路风险,需叠加以下措施:
-
HSTS 强制 HTTPS:添加
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;,防止 HTTP 明文请求被劫持后发起降级试探。 -
OCSP Stapling 验证证书有效性:启用
ssl_stapling on; ssl_stapling_verify on;并配置可靠 resolver,避免攻击者伪造或阻断 OCSP 响应来绕过证书吊销检查。 -
隐藏服务指纹:在 http 或 server 块中设置
server_tokens off;,减少攻击者识别 Nginx 版本后针对性利用已知漏洞的可能性。
验证是否真正生效
配置完成后务必实测,不能仅依赖语法检查:
- 用 OpenSSL 模拟 TLSv1.2 握手:
openssl s_client -connect yourdomain.com:443 -tls1_2 -cipher "RC4-MD5",应连接失败或协商出强套件,而非 RC4; - 使用 SSL Labs Test 全面扫描,目标评级为 A+,重点关注 “Downgrade attack prevention” 和 “Forward Secrecy” 两项是否通过;
- 运行
nginx -t && nginx -s reload确保配置加载无误。











