nginx 1.11.0+ 支持 rsa 与 ecdsa 双证书共存,需 openssl 1.0.2+、subject/san 完全一致的两套 pem 证书、私钥无密码,并按 ecc 后 rsa 顺序配置 ssl_certificate 指令,搭配 tlsv1.2+ 和含 ecdhe-ecdsa/rsa 的 cipher suite。

要在 Nginx 中真正实现“RSA + ECDSA 双证书共存”,核心不是让 Nginx 主动选择,而是让 TLS 协议层根据客户端能力自动协商最合适的证书——Nginx 只需正确提供两套匹配的证书+私钥,并启用兼容的协议与密钥交换机制。关键在于版本支持、证书一致性、配置顺序和密码套件控制,而非复杂逻辑。
确认基础环境是否达标
双证书功能依赖底层组件协同工作,缺一不可:
- Nginx 版本 ≥ 1.11.0(推荐 1.20+),必须编译时链接 OpenSSL 1.0.2 或更高版本(强烈建议 OpenSSL 1.1.1+ 或 3.x)
- 运行命令 nginx -V 2>&1 | grep -i openssl 查看编译所用 OpenSSL;再执行 openssl version 确认运行时版本一致
- 若系统自带 OpenSSL 过旧(如 CentOS 7 默认 1.0.2k),需升级 OpenSSL 并重新编译 Nginx,或使用官方预编译包
准备两套严格对齐的证书
不能复用私钥,也不能混用算法链;Subject 和 SAN 字段必须一字不差:
-
RSA 证书:用 2048 位或 3072 位 RSA 私钥生成 CSR,由 Let’s Encrypt(acme.sh 或 certbot 支持)、Sectigo 等 CA 签发,格式为 PEM(
fullchain_rsa.pem+privkey_rsa.pem) -
ECDSA 证书:用
secp256r1(P-256)曲线生成私钥(openssl ecparam -genkey -name prime256v1),同样提交 CSR 并签发;Let’s Encrypt 自 2021 年起原生支持 ECDSA - 两套证书的域名列表(CN + SAN)完全相同,例如都包含
example.com和www.example.com,否则部分客户端(尤其是 iOS/macOS)会拒绝 ECC 证书
在 server 块中正确声明双证书
Nginx ≥ 1.11.0 支持连续写入多组 ssl_certificate 和 ssl_certificate_key,按顺序加载并交由 TLS 栈协商:
- 把 ECC 证书放在 RSA 之后(实测更利于现代客户端优先选 ECDSA)
- 确保两个私钥均无密码保护(
openssl rsa -in privkey_rsa.pem -out privkey_rsa_nopass.pem),否则 Nginx 启动失败 - 配置示例:
ssl_certificate /etc/nginx/ssl/fullchain_ecc.pem;
ssl_certificate_key /etc/nginx/ssl/privkey_ecc.pem;
ssl_certificate /etc/nginx/ssl/fullchain_rsa.pem;
ssl_certificate_key /etc/nginx/ssl/privkey_rsa.pem;
配套 TLS 协议与密码套件设置
仅配证书不够,必须显式启用支持两种签名算法的协议栈和 cipher suite:
- 强制启用 TLSv1.2 和 TLSv1.3:ssl_protocols TLSv1.2 TLSv1.3;
- 密码套件需同时包含
ECDHE-ECDSA-*和ECDHE-RSA-*类型,推荐精简安全组合:
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
- 可选增强:开启 OCSP stapling 加速证书状态验证,提升握手速度:
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s;











