Nginx支持RSA与ECC双证书共存需满足四条件:1. Nginx≥1.11.0且OpenSSL≥1.0.2;2. 两套证书Subject与SAN完全一致;3. server块中紧邻声明两组ssl_certificate指令,ECC建议置后;4. ssl_ciphers须同时包含ECDHE-ECDSA与ECDHE-RSA前缀套件,并启用TLSv1.2+。

要在 Nginx 中同时支持 RSA 与 ECC 两种证书,核心不是“叠加加载”,而是让 TLS 协商阶段能根据客户端能力自动选配最合适的证书。这需要版本支持、证书一致性、密钥分离和密码套件精准匹配四个条件齐备,缺一不可。
确认环境基础是否达标
Nginx 必须是 1.11.0 及以上版本,OpenSSL 至少为 1.0.2(推荐 1.1.1 或更高),才能原生解析多组 ssl_certificate 指令并完成 ECC/RSA 自动协商。执行以下命令验证:
-
nginx -V 2>&1 | grep -i openssl查看编译时 OpenSSL 版本 -
openssl version确认运行时版本一致 - 若两者不一致或低于要求,需重新编译 Nginx 或升级系统 OpenSSL
准备两套完全独立但信息一致的证书
RSA 和 ECC 不能共用私钥,也不能混用公钥与签名算法。必须分别生成、申请、部署:
- RSA 侧:用
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048生成私钥,再签发 PEM 格式证书(含完整链) - ECC 侧:用
openssl ecparam -name secp256r1 -genkey生成私钥,同样向支持 ECDSA 的 CA(如 Let's Encrypt)申请证书 - 两个证书的 Subject 和所有 Subject Alternative Name(SAN) 必须逐字相同,否则现代浏览器会拒绝 ECC 证书
在 server 块中正确声明双证书
把两组证书指令紧挨着写在同一 server 块内,顺序建议 ECC 在后(部分旧客户端更倾向先尝试 ECC):
ssl_certificate /etc/nginx/ssl/example.com.fullchain_rsa.pem; ssl_certificate_key /etc/nginx/ssl/example.com.privkey_rsa.pem; ssl_certificate /etc/nginx/ssl/example.com.fullchain_ecc.pem; ssl_certificate_key /etc/nginx/ssl/example.com.privkey_ecc.pem;
- 确保所有私钥均未设密码,否则 Nginx 启动时无法自动加载第二组
- 必须启用 TLSv1.2 和 TLSv1.3:
ssl_protocols TLSv1.2 TLSv1.3; - 禁用不安全协议如 SSLv3、TLSv1.0/1.1
配置密码套件以驱动算法协商
密码套件决定了客户端能用哪种证书做密钥交换。必须显式包含 ECDSA 和 RSA 两类前缀的组合:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
- 优先使用 AEAD 类型(如 AES-GCM、ChaCha20-Poly1305),避免 CBC 模式
- 不推荐混入纯 RSA 密钥交换(
RSA-AES)等已淘汰方式 - 可搭配
ssl_prefer_server_ciphers on;强化服务端策略控制力
配置完成后 reload Nginx,并用 SSL Labs 测试工具 验证是否显示 “ECC certificate” 和 “RSA certificate” 均被识别;也可用 OpenSSL 命令模拟不同客户端行为,确认协商路径正常。



















