开启 ssl_prefer_server_ciphers on 是关键开关,仅将TLS 1.2加密套件选择权交还服务端;真正决定安全等级的是严格排序的ssl_ciphers(如ECDHE+AES-GCM/ChaCha20)、禁用TLSv1.0/1.1、指定安全椭圆曲线及实测验证。

开启 ssl_prefer_server_ciphers on 是让 Nginx 在 TLS 1.2 握手时按服务端配置顺序选择加密套件的关键动作,但它本身不决定“哪个更强”,只把协商主导权从客户端移交到服务端。真正起作用的是你如何组织整个 SSL 配置链条。
必须显式启用并放在 server 块内
该指令默认为 off,不写等于未启用。不能依赖 http 块的全局设置,尤其当存在多个 HTTPS server(如主站、API 子域名、跳转入口)时,每个 server 块都必须单独包含:
ssl_prefer_server_ciphers on;- 避免被 include 文件或其他低优先级配置意外覆盖(例如某子域名配置中误设为
off) - TLS 1.3 不受此指令影响(其套件由协议强制定义),但保留该配置对 TLS 1.2 安全控制必不可少
ssl_ciphers 必须严格排序且剔除弱项
开启 prefer 后,Nginx 会从左到右匹配第一个客户端支持的套件。因此,顺序即安全等级——开头必须是现代强组合:
- 推荐以 ECDHE + AES-GCM 或 ChaCha20-Poly1305 开头,例如:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 末尾可追加兼容项(如
ECDHE-RSA-AES128-SHA),但仅限必要场景,且绝不可混入 RSA 密钥交换套件(如AES128-SHA),它们不支持前向保密 - 用
!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL显式过滤已淘汰算法,不依赖模糊宏(如HIGH)
必须协同限制协议版本与密钥交换参数
再强的 cipher list,若允许老旧协议或弱密钥交换,仍可能协商出不安全连接:
- 禁用 TLSv1.0 和 TLSv1.1:
ssl_protocols TLSv1.2 TLSv1.3;(不要写TLSv1,它等价于 TLSv1.0) - 指定高性能安全椭圆曲线:
ssl_ecdh_curve secp384r1:prime256v1;,兼顾计算效率与主流设备兼容性 - 启用会话缓存减少重复握手:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;
配置后务必实测验证是否生效
重载 Nginx 不代表策略落地,需交叉验证:
- 运行
nginx -t确认语法无误,再nginx -s reload - 用 OpenSSL 检查 TLS 1.2 协商结果:
openssl s_client -connect yourdomain.com:443 -tls1_2 | grep "Cipher is"
输出的套件应是你ssl_ciphers列表中最靠前的那个强套件 - 使用 SSL Labs Server Test 查看 “Handshake Simulation”,确认 Chrome、Firefox、Android 等主流客户端实际协商出的套件符合你的排序预期


















