多算法证书共存需通过ssl_ciphers排序与ssl_prefer_server_ciphers等协同配置,确保ECDSA/RSA套件分别匹配对应证书,现代客户端优先使用ECDSA高效套件,旧客户端自动回落RSA套件。

多算法证书(如同时部署 RSA 和 ECDSA 证书)本身不改变 ssl_ciphers 的生效逻辑,但会显著影响套件协商结果——关键在于让 Nginx 在同一 server 块中,对不同证书类型分别匹配其支持的最强套件,而非降级或错配。调优的核心不是“让两种证书共存”,而是通过 ssl_ciphers 排序 + 协同指令,确保每类客户端都落到对应证书下最安全、最高效的套件上。
明确 ECDHE 套件与证书类型的绑定关系
套件中的身份认证字段(RSA 或 ECDSA)必须与当前使用的证书类型一致,否则该套件无法完成握手:
- ECDHE-RSA-AES128-GCM-SHA256 只能用于 RSA 证书;ECDSA 证书下此套件完全无效
- ECDHE-ECDSA-AES128-GCM-SHA256 只能用于 ECDSA 证书;RSA 证书下此套件被跳过
- Nginx 不会自动“切换证书”来适配套件;它按
ssl_ciphers顺序逐个尝试,一旦找到与当前证书匹配且客户端也支持的套件,即完成协商
推荐的双证书兼容型 ssl_ciphers 排序策略
为兼顾 RSA 与 ECDSA 证书优势(如 ECDSA 更快、签名更短),应将两类套件按性能与安全优先级交错排列,而非简单分组:
- 把 ECDSA 套件放在最前:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
- 紧随其后放 RSA 套件:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305
- 末尾可选保留极少量兼容项(仅当业务强依赖旧客户端)::ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA
这样设计的好处是:支持 ECDSA 的现代客户端(Chrome/Firefox/Safari 最新版、iOS 15+/Android 12+)优先走 ECDSA 路径,获得更低延迟和更高吞吐;仅支持 RSA 的客户端自然回落到 RSA 套件,不干扰主流程。
必须配套的三项关键配置
仅靠 ssl_ciphers 排序无法保证双证书策略落地,以下三项缺一不可:
-
启用服务端优先权:
ssl_prefer_server_ciphers on;—— 否则客户端可能无视你的排序,强行挑一个它喜欢但证书不匹配的弱套件(尤其 TLS 1.2 下) -
限定协议版本:
ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/1.1,避免它们绕过 AEAD 套件强制使用 CBC 模式 -
指定高效椭圆曲线:
ssl_ecdh_curve secp384r1:prime256v1;—— 提升 ECDHE 计算效率,尤其在 ECDSA 场景下降低 handshake 延迟
验证是否真正按预期工作
配置 reload 后,不能只看语法是否通过,需分场景实测:
- 用
openssl s_client -connect example.com:443 -tls1_2 -cipher 'ECDHE-ECDSA-AES128-GCM-SHA256' -servername example.com测试 ECDSA 套件是否可通 - 用
openssl s_client -connect example.com:443 -tls1_2 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' -servername example.com测试 RSA 套件是否可通 - 访问 SSL Labs Test,确认报告中显示的“Handshake Simulation”里,各主流客户端(尤其是 iOS Safari、Android Chrome)均协商到 GCM 或 ChaCha20 套件,且无降级到 SHA1/CBC 的记录











