开启 ssl_prefer_server_ciphers on 是让 nginx 在 tls 1.2 握手时按服务端 ssl_ciphers 顺序优先选择强加密套件,但必须显式配置于 server 块、配合剔除弱算法的严格排序套件(如 ecdhe+aes-gcm/chacha20)、限定 tlsv1.2+ 协议及指定安全曲线,并通过 openssl 和 ssl labs 实测验证才真正生效。

开启 ssl_prefer_server_ciphers on 是让 Nginx 在 TLS 1.2 握手时按你设定的顺序选用加密套件,但它本身不提升强度——真正起作用的是你写的 ssl_ciphers 列表是否合理、排序是否靠前、是否剔除了弱算法。
必须显式启用并放在 server 块内
该指令默认是 off,不写等于没配。不能只依赖全局 http 块设置,必须确保每个启用 HTTPS 的 server 块中都包含:
ssl_prefer_server_ciphers on;- 与之配套的
ssl_ciphers和ssl_protocols - 避免被 include 文件或低优先级配置覆盖(例如某子域名配置里误设为
off)
加密套件要严格排序,开头即最强
静态站点不需要兼容老旧客户端,应把支持前向保密(PFS)、AEAD 模式、低延迟的组合放在最前面:
- 推荐开头组合:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 明确排除弱项:
!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL - 不要用模糊表达如
HIGH或!aNULL:!MD5,它们无法过滤掉非 PFS 套件
协议与密钥交换必须协同限制
再强的套件列表,若允许 TLSv1.0 握手,仍可能降级到弱算法:
- 只启用:
ssl_protocols TLSv1.2 TLSv1.3;(TLSv1.3 自动忽略该指令,但保留它保障 TLSv1.2 安全) - 指定高效安全曲线:
ssl_ecdh_curve secp384r1:prime256v1;,兼顾性能与基础兼容性 - 可选增强:
ssl_dhparam /path/to/dhparam.pem;(2048 位以上,强化 DH 密钥交换)
验证是否真正生效
改完配置后不能只 reload,必须实测确认协商结果:
- 命令行验证 TLSv1.2 协商:
openssl s_client -connect yourdomain.com:443 -tls1_2 | grep "Cipher is",输出应是你ssl_ciphers中第一个套件 - 用 SSL Labs 全面扫描,重点看 “Handshake Simulation” 中各客户端是否都协商到 ECDHE+GCM/ChaCha20,且 “Key Exchange” 显示 PFS
- 检查 Nginx 错误日志,确认无 SSL 相关警告或 fallback 提示











