Nginx自动分发RSA或ECC证书的关键是满足四项硬性条件:Nginx≥1.11.0且OpenSSL≥1.0.2、两证书Subject/SAN完全一致、server块中紧邻声明双证书(推荐RSA在前ECC在后)、ssl_ciphers同时包含ECDHE-ECDSA与ECDHE-RSA套件并启用TLSv1.2+。

要在生产环境让 Nginx 自动根据客户端能力分发 RSA 或 ECC 证书,关键不是手动切换,而是配置一套“一次部署、自动适配”的双证书机制。它依赖 TLS 协议层的协商逻辑,由客户端在握手时决定用哪套证书,服务端只需正确提供并满足四项硬性条件。
确认基础环境是否就绪
版本不达标,后续所有配置都无效:
- 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,ECC 协商更稳定,建议启用
准备两套完全独立但信息一致的证书
不能复用私钥,也不能只改格式——必须是两套完整、并行的 PEM 文件:
- RSA 侧:用 openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 生成私钥,向 Let’s Encrypt 或 Sectigo 等主流 CA 申请标准 RSA 证书(含完整链)
- ECC 侧:用 openssl ecparam -name secp256r1 -genkey 生成私钥,同样向支持 ECDSA 的 CA(如 Let’s Encrypt,自 2021 年全面支持)申请证书
- 两个证书的 Subject 和全部 Subject Alternative Name(SAN) 必须逐字相同(包括大小写、通配符格式),否则浏览器会拒绝 ECC 证书
- 两套私钥均不可设密码;若有密码,Nginx 启动时无法加载第二组,导致双证书失效
在 server 块中精准声明双证书
顺序、紧邻、无干扰是生效前提:
- 在同一个 server 块内,连续写入两组指令,中间不插入任何其他 ssl_* 行
- 推荐顺序:RSA 在前,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;
配置协议与密码套件驱动协商行为
证书只是“材料”,密码套件才是“开关”——它告诉客户端“你有资格选哪种”:
- 明确启用安全协议:ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1 和 SSLv3)
- 密码套件必须同时包含 ECDHE-ECDSA 和 ECDHE-RSA 前缀,例如:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; - 避免使用仅含 RSA 或仅含 ECDSA 的精简套件,否则会单边阻断协商路径










