开启 ssl_prefer_server_ciphers on 的核心目的是让 Nginx 在 TLS 握手时强制采用自身配置的加密套件顺序,而非被动接受客户端提出的弱或过时算法,从而确保安全策略有效落地,但必须配合禁用弱协议、精简强 cipher list 和优化密钥交换等措施才能真正生效。

开启 ssl_prefer_server_ciphers on 的核心目的,是让 Nginx 在 TLS 握手时坚持使用自己配置的加密套件顺序,而不是迁就客户端提出的弱或过时选项。它本身不提供安全,但能确保你精心设计的安全策略真正落地。
为什么默认行为存在风险
TLS 协商过程中,客户端会发送它支持的所有 cipher suite 列表(按偏好排序),Nginx 默认从中选择第一个双方都支持的套件。问题在于:很多旧客户端(或被篡改的中间设备)仍会带上 RC4、3DES、SHA1 等已被淘汰的算法。只要服务端 ssl_ciphers 列表里还留着它们,哪怕排在最后,也可能被选中——尤其当攻击者主动干扰握手、伪造客户端能力时。
- 不开启该指令,服务端相当于“被动接受协商结果”,安全控制权部分让渡给客户端
- 开启后,Nginx 只从自己
ssl_ciphers配置中按顺序匹配,跳过客户端列表里的低优先级项 - 这是对抗协议降级攻击的第一道防线,但仅靠它无法单独奏效
必须同步配置的三项关键措施
这个指令的价值完全依赖于配套设置。脱离上下文单独打开,既无效,还可能掩盖真实问题。
-
限定 TLS 版本:只启用
ssl_protocols TLSv1.2 TLSv1.3。TLSv1.0/1.1 已被主流弃用且存在严重漏洞;TLSv1.3 下该指令自动失效,所以它的作用域集中在 TLSv1.2 场景 -
精简并加固 cipher list:剔除所有已知脆弱算法(RC4、DES、3DES、MD5、SHA1、EXPORT、NULL)。推荐组合以 ECDHE 密钥交换 + AES-GCM 或 ChaCha20 加密为主,例如:
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_ecdh_curve secp384r1:prime256v1,避免因曲线不匹配而 fallback 到非前向保密(non-PFS)的 RSA 密钥交换
验证是否真正生效
配置不是写完就结束,必须通过实测确认行为符合预期。
- 用 OpenSSL 强制指定 TLSv1.2 发起连接:
openssl s_client -connect yourdomain.com:443 -tls1_2
观察输出中的Cipher行,确认它落在你配置的 cipher list 前段,且不含任何已禁用算法 - 使用 SSL Labs 的在线测试(ssllabs.com)全面评估,目标评级为 A+。它会明确指出是否协商出弱套件、是否启用 HSTS、OCSP Stapling 是否正常等
- 检查 Nginx 配置语法并重载:
nginx -t && nginx -s reload,避免因格式错误导致指令未加载
它不是万能开关,而是策略闭环的一环
ssl_prefer_server_ciphers 是一个控制权移交指令,意义在于把加密决策权收回到服务端手中。但它无法弥补 cipher list 本身的缺陷,也不能替代协议版本限制、证书有效性验证或 HTTP 层防护。
- 搭配 HSTS 头(
Strict-Transport-Security)可防止首次请求被降级到 HTTP - 启用 OCSP Stapling(
ssl_stapling on)能快速验证证书状态,阻断吊销证书的滥用 - 关闭服务标识(
server_tokens off)减少攻击面,避免暴露 Nginx 版本细节











