开启ssl_prefer_server_ciphers on的本质是将tls握手加密套件选择权从客户端收归nginx服务端,确保严格按ssl_ciphers从左到右匹配首个客户端支持的强套件,但必须配置在server块内、配合精简强序cipher列表、禁用tlsv1.0/1.1才能真正生效。

开启 ssl_prefer_server_ciphers on 的本质,是把 TLS 握手时加密套件的选择权从客户端交还给 Nginx 服务端,确保按你配置的 ssl_ciphers 顺序来协商——但它本身不提升安全,只让安全配置真正生效。
必须写在 server 块内,不能只在 http 块设
该指令需与 ssl_certificate、ssl_ciphers 等参数同级,放在具体的 HTTPS server 块中。若仅在 http 块全局启用,但某个 server 没配 ssl_ciphers,该站点就会回退到默认弱策略。
- ✅ 正确位置:
server { listen 443 ssl; ssl_certificate ...; ssl_ciphers ...; ssl_prefer_server_ciphers on; } - ❌ 错误做法:只在
http块写ssl_prefer_server_ciphers on;,却漏掉具体站点的ssl_ciphers
必须配合干净、强序的 ssl_ciphers 列表
ssl_prefer_server_ciphers on 只是开关,真正起作用的是你写的 ssl_ciphers 内容。它从左到右匹配第一个客户端也支持的套件,所以顺序即优先级。
- 推荐现代 AEAD 套件(硬件加速友好):
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 必须剔除所有已淘汰算法:RC4、DES、3DES、MD5、SHA1(签名除外)、EXPORT、NULL、CBC 模式套件(如
-SHA或-CBC-结尾的) - 避免模糊表达:
HIGH、!aNULL等无法排除非前向保密或 SHA1 套件,应显式列举
必须禁用 TLSv1.0 和 TLSv1.1
TLS 1.0/1.1 不仅协议设计有缺陷(如 BEAST、POODLE),还强制依赖 CBC 模式,无法使用 AES-GCM 或 ChaCha20 等现代 AEAD 加密。即使 ssl_ciphers 写得再强,只要允许旧协议,就可能被降级或触发不安全协商。
- 明确限定:
ssl_protocols TLSv1.2 TLSv1.3;(不要写TLSv1或TLSv1.1) - TLS 1.3 自动忽略
ssl_ciphers和ssl_prefer_server_ciphers,但该指令对 TLS 1.2 握手仍关键,不可省略
验证是否真正生效
配置完别只跑 nginx -t,要实测 TLS 1.2 协商结果:
- 命令验证:
openssl s_client -connect yourdomain.com:443 -tls1_2 | grep "Cipher is",输出应为ssl_ciphers中最靠前的那个强套件(如ECDHE-RSA-AES128-GCM-SHA256) - 全量扫描:SSL Labs Test 查看 “Cipher Suites” 是否全为 ECDHE+GCM/ChaCha20,“Key Exchange” 是否显示 PFS
- 确认无弱套件残留:若输出中出现
AES128-SHA或RC4-MD5,说明ssl_ciphers没清干净或ssl_prefer_server_ciphers未生效











