Nginx通过双证书部署(RSA在前、ECDSA在后)和密码套件协同实现TLS握手时自动协商:现代客户端选ECDSA,老旧设备回退RSA;需Nginx≥1.11.0、OpenSSL≥1.0.2、TLSv1.2+,且两套证书须同CA、同域名、同扩展。

要让 Nginx 在 TLS 握手阶段智能选择 RSA 或 ECDSA 证书,核心不是“切换”,而是让客户端按自身能力自动协商——支持 ECDSA 的现代终端走 ECC 路径,老旧设备 fallback 到 RSA。这依赖双证书部署 + 协商策略控制,而非运行时判断。
确认基础环境是否达标
版本不匹配会导致双证书被忽略或降级为单路径:
- Nginx ≥ 1.11.0(推荐 1.21.0+),执行
nginx -v查看 - OpenSSL ≥ 1.0.2(强烈建议 1.1.1 或 3.x),用
openssl version和nginx -V 2>&1 | grep -i openssl双重验证编译与运行时版本一致 - 操作系统需启用 TLSv1.2+;若开启 TLSv1.3,ECDSA 协商更稳定,建议启用
准备两套完全独立但信息一致的证书
不能共用私钥,也不能仅转换格式。必须是两组完整 PEM 文件:
- RSA 证书链:含
rsa.crt(含完整链)、rsa.key(无密码) - ECC 证书链:含
ecc.crt(Subject/SAN 与 RSA 完全一致)、ecc.key(secp256r1 或 X25519,无密码) - 两套证书必须由同一 CA 签发,且域名、有效期、扩展字段(如 Key Usage、Extended Key Usage)保持一致,否则部分客户端会拒绝协商
在 server 块中正确声明双证书顺序
Nginx 按配置顺序提供证书选项,客户端从中选取第一个兼容项。推荐写法:
ssl_certificate /etc/nginx/ssl/rsa.crt; ssl_certificate_key /etc/nginx/ssl/rsa.key; ssl_certificate /etc/nginx/ssl/ecc.crt; ssl_certificate_key /etc/nginx/ssl/ecc.key;
注意:RSA 必须放在 ECC 前面。虽然 ECC 性能更好,但把 RSA 放前可确保旧客户端(如 IE11/Win7、Android 4.x)首次握手即命中,避免因不识别 ECC 证书而中断连接。
协同配置密码套件与曲线限制
仅加载双证书不够,还需引导客户端选对路径:
- 密码套件中同时包含
ECDHE-ECDSA和ECDHE-RSA类型,例如:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305 - 启用
ssl_prefer_server_ciphers on;,确保你的套件顺序生效 - 用
ssl_conf_command锁定高效曲线与签名算法:ssl_conf_command Curves X25519:secp256r1;ssl_conf_command SignatureAlgorithms ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256; - 禁用 TLSv1.0/TLSv1.1,只保留
TLSv1.2 TLSv1.3,避免老协议干扰 ECDSA 协商


















