nginx 1.11.0+ 支持双证书配置,需分别提供 rsa 和 ecc 两套 pem 格式证书与私钥,subject/san 必须一致,并启用 tlsv1.2+ 与兼容密钥交换的 cipher suite。

要让 Nginx 同时支持 RSA 和 ECC 双证书(即一个域名下同时提供两种密钥交换能力),关键在于使用 多证书配置,而非“双私钥共用”——Nginx 本身不支持单个 server 块内加载两个独立的 ssl_certificate 指令,但可通过 SSL/TLS 协议层的证书链协商机制 实现兼容:客户端根据自身能力选择合适的证书(RSA 或 ECC),前提是服务端正确提供对应证书与私钥,并启用支持两种密钥类型的 TLS 配置。
确认 OpenSSL 与 Nginx 版本支持
Nginx 1.11.0+ 原生支持多证书(通过 ssl_certificate + ssl_certificate_key 多组指令),但需搭配 OpenSSL 1.0.2+(推荐 1.1.1+)才能完整支持 TLS 1.3 中的 ECDSA 证书协商。检查方式:
- 运行
nginx -V 2>&1 | grep -i openssl查看编译的 OpenSSL 版本 - 执行
openssl version确认运行时版本一致 - 若低于 OpenSSL 1.0.2,需升级系统或编译新版 Nginx
准备 RSA 与 ECC 两套证书+私钥
必须分别生成并签发两套独立证书,不可复用私钥或混用算法:
- RSA 证书:使用 2048 位或 3072 位 RSA 私钥,由主流 CA(如 Let's Encrypt、Sectigo)签发,格式为 PEM
- ECC 证书:使用 secp256r1(P-256)或 secp384r1(P-384)椭圆曲线私钥,同样需 CA 支持(Let's Encrypt 自 2021 年起全面支持 ECDSA 证书)
- 注意:两个证书的
Subject和Subject Alternative Name (SAN)必须完全一致,否则浏览器可能拒绝 ECC 证书
配置 Nginx 启用双证书(Nginx ≥1.11.0)
在 server 块中按顺序声明两组证书,Nginx 会自动根据客户端 ClientHello 中的 signature_algorithms 扩展选择匹配的证书:
ssl_certificate /path/to/fullchain_rsa.pem; ssl_certificate_key /path/to/privkey_rsa.pem; ssl_certificate /path/to/fullchain_ecc.pem; ssl_certificate_key /path/to/privkey_ecc.pem;
⚠️ 注意事项:
- 两组指令必须紧邻,且 ECC 组建议放在 RSA 组之后(部分旧客户端更倾向优先尝试 ECC)
- 确保私钥无密码,否则 Nginx 启动时无法自动加载第二组
- 必须启用 TLS 1.2+,并在
ssl_protocols中明确包含:TLSv1.2 TLSv1.3 - 推荐搭配如下 cipher suite 以兼顾兼容性与安全性:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
验证是否生效
部署后使用以下方式确认双证书已正确协商:
- 在线工具:访问 SSL Labs Test,查看 “Certification Paths” 是否列出两条有效链(RSA 和 ECDSA)
- 命令行验证:
openssl s_client -connect example.com:443 -servername example.com -tls1_2 -cipher ECDHE-ECDSA-AES128-GCM-SHA256 2>/dev/null | grep "subject="应显示 ECC 证书信息;替换 cipher 为ECDHE-RSA-AES128-GCM-SHA256则应显示 RSA 证书 - 浏览器开发者工具 → Security 标签页 → 查看 “Certificate” 的签名算法(sha256WithRSAEncryption 或 ecdsa-with-SHA256)










