nginx ssl优先级由ssl_prefer_server_ciphers开关控制,开启后ssl_ciphers顺序决定套件选择;ecdsa套件应置前以优先匹配对应证书;需禁用旧协议、指定安全曲线并启用会话缓存。

在 Nginx 中设置 SSL 配置的优先级,核心不是“给配置本身排先后”,而是通过几项关键指令协同控制 TLS 握手过程中**加密套件选择、协议版本、证书匹配和密钥交换方式**的决策权归属与执行顺序。真正起作用的是服务端对协商流程的主导能力,而非配置行的书写位置。
ssl_prefer_server_ciphers 必须显式开启
该指令是整个优先级机制的开关,默认值为 off,不写等于没开。它决定 TLS 1.2 及更早版本中,由谁来选加密套件:
- 设为 on:Nginx 按你写的
ssl_ciphers从左到右逐个尝试,选第一个客户端也支持的套件 - 设为 off(默认):客户端可自行挑它喜欢的套件,哪怕是你列表里靠后、安全性更弱的项
- 只影响 TLS 1.2;TLS 1.3 套件由协议强制规定,不受此指令控制,但仍需保留该配置以保障旧协议安全
ssl_ciphers 排序即安全等级排序
开启 ssl_prefer_server_ciphers on 后,ssl_ciphers 的顺序直接决定实际使用的套件强度。推荐结构如下:
- 开头放现代强组合:如
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305 - 中间可接兼容性较强的 RSA 套件:如
ECDHE-RSA-AES256-GCM-SHA384 - 末尾谨慎加极少量降级项(仅当业务必须支持 IE11 等老客户端):如
ECDHE-RSA-AES128-SHA - 用
!RC4:!MD5:!SHA1:!DES:!3DES:!EXPORT:!aNULL:!eNULL主动剔除已淘汰算法
多证书场景下优先级靠套件与证书类型绑定
当你同时部署 ECDSA 和 RSA 证书时,Nginx 不会自动切换证书去适配套件。优先级体现在套件能否匹配当前证书:
-
ECDHE-ECDSA-*类套件只能用于 ECDSA 证书,RSA 证书下会被跳过 -
ECDHE-RSA-*类套件只能用于 RSA 证书,ECDSA 证书下无效 - 所以要把 ECDSA 套件放在
ssl_ciphers最前面——支持它的客户端(Chrome/Firefox/Safari 新版、iOS 15+/Android 12+)自然优先走 ECDSA 路径;不支持的则回落到后面的 RSA 套件
必须配套限制协议与密钥交换参数
再强的 cipher list,若允许老旧协议或弱参数,仍可能协商出不安全连接:
- 禁用 TLSv1.0/1.1:
ssl_protocols TLSv1.2 TLSv1.3; - 指定安全椭圆曲线:
ssl_ecdh_curve secp384r1:prime256v1;(提升 ECDHE 效率,兼顾兼容性) - 启用会话缓存:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;,减少重复握手开销











