部署双证书(RSA + ECC)的核心原理,是在同一个服务(如 Nginx)上同时配置两套SSL证书。服务器在 TLS 握手时,会根据客户端(浏览器或老旧设备)支持的加密算法,自动协商选择 RSA 或 ECC 证书,从而实现“现代设备用 ECC 提升性能与安全,老旧设备用 RSA 保证兼容”的目标。
下面是基于 Nginx 的完整部署方案(这是最常见的场景),其他 Web 服务器如 Apache、Caddy 原理类似。
1. 准备证书文件
你需要拥有两套完整的证书文件:
ECC 证书:适用于现代浏览器(TLS 1.2+)。
私钥:`example.com-ecc.key`
证书:`example.com-ecc.crt`(通常已包含中间证书链)
RSA 证书:适用于老旧客户端(如 Windows XP、旧版 Android、Java 6 等)。
私钥:`example.com-rsa.key`
证书:`example.com-rsa.crt`(包含中间证书链)
生成方式参考(使用 Let’s Encrypt 为例):
bash
# 使用 Certbot 同时获取 RSA 和 ECC 证书
certbot certonly --standalone -d example.com --key-type rsa
certbot certonly --standalone -d example.com --key-type ecdsa
2. 配置 Nginx 双证书
在 Nginx 的 `server` 块中,同时指定两套证书。Nginx 会自动根据客户端支持的算法选择最优证书(优先 ECC,若客户端不支持则回退 RSA)。
nginx
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
# 同时配置两套证书(顺序无严格影响,但建议 ECC 在前)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # ECC 证书链
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # ECC 私钥
ssl_certificate /etc/letsencrypt/live/example.com-rsa/fullchain.pem; # RSA 证书链
ssl_certificate_key /etc/letsencrypt/live/example.com-rsa/privkey.pem; # RSA 私钥
# 可选:指定优先使用的加密套件顺序
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';
ssl_prefer_server_ciphers off; # 让客户端选择套件,以支持更广泛的兼容性
# 其他 SSL 安全配置(如 HSTS、OCSP Stapling 等)
# ...
}
> 注意:
> - 从 Nginx 1.11.0 开始支持在同一个 `listen` 指令下配置多份证书。
> - 如果你使用的是较老版本,可能需要将 ECC 和 RSA 分别放在两个不同的 `server` 块并通过 IP 或端口区分,但这不推荐且复杂,建议升级 Nginx。
3. 验证配置
配置完成后,使用以下命令测试:
bash
# 测试 Nginx 配置语法
nginx -t
# 重新加载配置
nginx -s reload
验证双证书是否生效:
现代客户端(支持 ECC):使用浏览器访问网站,查看证书详情,应显示为 **ECDSA** 密钥(椭圆曲线)。
模拟老旧设备:使用 `openssl` 命令强制指定 RSA 加密套件进行测试,应能成功握手并使用 RSA 证书。
bash
# 测试 ECC 连接(默认优先)
openssl s_client -connect example.com:443 -servername example.com
# 强制指定 RSA 套件,测试 RSA 证书是否可用
openssl s_client -connect example.com:443 -servername example.com -cipher ECDHE-RSA-AES128-GCM-SHA256
4. 其他服务器的配置参考
Apache(httpd)
在 Apache 中,可以通过 `SSLCertificateFile` 和 `SSLCertificateKeyFile` 同时指定多份证书(从 2.4.8 开始支持):
apache
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/example.com-ecc.crt
SSLCertificateKeyFile /path/to/example.com-ecc.key
SSLCertificateFile /path/to/example.com-rsa.crt
SSLCertificateKeyFile /path/to/example.com-rsa.key
# 其他配置...
</VirtualHost>
Caddy
Caddy 支持自动管理证书,且默认会尝试获取 ECC 证书,并在配置中自动处理双SSL证书,通常无需手动干预。如果使用手动证书,可在 `tls` 指令中指定多对证书。
5. 注意事项
证书链完整性:无论是 RSA 还是 ECC 证书,都必须包含完整的中间证书链,否则老旧客户端可能因无法构建信任链而失败。
OCSP Stapling:如果启用 OCSP Stapling,只能为其中一套证书配置(通常选择 ECC 或主证书),但不会影响兼容性。
协议版本:老旧设备可能仅支持 TLS 1.0/1.1,如果你的服务禁用了这些协议,即使有 RSA 证书也无法连接。如需彻底兼容,需开启 TLS 1.0/1.1(但存在安全风险,需权衡)。
证书续期:如果使用 Let’s Encrypt 等自动化工具,需要确保 RSA 和 ECC 两套证书都能被自动续期。
用户通过以上配置,你可以在不牺牲现代浏览器性能和安全性的前提下,最大限度地兼容老旧设备。