Nginx ≥1.11.0 可原生并列配置 ECC 与 RSA 双证书,要求 OpenSSL ≥1.0.2、TLS 1.2+,且两证书 Subject/SAN 完全一致、私钥无密码、cipher 含 ECDHE-ECDSA 套件。

要让 Nginx 同时支持 ECC 和 RSA 两种证书,核心是利用其原生多证书机制(Nginx ≥1.11.0),而非“合并”或“切换”逻辑——服务端按顺序提供两套完整证书链,由客户端在 TLS 握手阶段根据自身能力自动选择匹配的证书与密钥交换方式。
版本与环境前提
双证书功能不是所有 Nginx 都能用,必须满足以下硬性条件:
- 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双查,确保编译时和运行时版本一致 - 系统需支持 TLS 1.2 及以上协议;TLS 1.3 更佳,因 ECDSA 证书协商在该版本中更稳定
证书准备要点
两套证书不是随便配对,必须严格满足一致性与独立性:
- Subject 和 Subject Alternative Name(SAN)字段必须完全相同,包括大小写与通配符格式,否则浏览器可能拒绝 ECC 证书
- RSA 证书:使用 2048 位或 3072 位私钥,由主流 CA(如 Let’s Encrypt、Sectigo)签发,PEM 格式
- ECC 证书:使用 secp256r1(P-256)或 secp384r1(P-384)曲线生成私钥,同样需 CA 支持(Let’s Encrypt 自 2021 年起全面支持 ECDSA)
- 严禁复用私钥、混用算法或截取证书链;每套证书必须含完整 fullchain.pem(证书 + 中间 CA)与对应无密码私钥
Nginx 配置写法与关键细节
在 server 块内直接并列声明两组指令,顺序和格式影响协商行为:
- 写法示例(路径按实际调整):
ssl_certificate /etc/nginx/ssl/example.com.fullchain_rsa.pem;<br> ssl_certificate_key /etc/nginx/ssl/example.com.privkey_rsa.pem;<br> ssl_certificate /etc/nginx/ssl/example.com.fullchain_ecc.pem;<br> ssl_certificate_key /etc/nginx/ssl/example.com.privkey_ecc.pem;
- 两组指令必须紧邻,中间不能插入其他 ssl_* 指令;ECC 组建议放在 RSA 组之后,因部分旧客户端倾向优先尝试 ECC
- 私钥文件必须无密码;若设置了密码,Nginx 启动时无法自动加载第二组,导致配置失败
- 务必启用 TLS 1.2+:
ssl_protocols TLSv1.2 TLSv1.3;
密码套件与验证方法
光有证书不够,cipher suite 决定客户端能否真正选中 ECC 路径:
- 推荐 cipher 配置(兼顾安全与兼容):
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; - 避免使用纯 RSA 密钥交换(如
RSA-AES128-GCM-SHA256),它会绕过证书协商,强制走 RSA 路径 - 验证是否生效:
• 本地测试:用openssl s_client -connect example.com:443 -tls1_2 -cipher ECDHE-ECDSA-AES128-GCM-SHA256查看返回证书是否为 ECC 全链
• 在线工具:Qualys SSL Labs 测试报告中,“Certificate #2” 应显示 ECC 类型及对应签名算法(如 ecdsa-with-SHA256)











