文档中心
Nginx鍙互閰嶇疆澶氫釜SSL璇佷功鍚楋紵娣卞叆瑙f瀽澶氳瘉涔﹂厤缃柟妗?txt
时间 : 2025-09-27 16:26:38浏览量 : 4

作为网站管理员或运维人员,你可能经常遇到这样的需求:一个Nginx服务器需要同时托管多个网站,每个网站都需要自己的SSL证书。那么问题来了——Nginx真的可以配置多个SSL证书吗?答案是肯定的!本文将用通俗易懂的方式,带你全面了解Nginx的多SSL证书配置方案。
为什么需要多个SSL证书?
在深入技术细节前,我们先看几个常见场景:
1. 多域名托管:你的服务器同时运行着shop.example.com和blog.example.com两个网站
2. 不同安全级别:主站使用标准DV证书,而支付页面使用更严格的EV证书
3. 新旧证书过渡:在证书更新期间同时保留新旧两个证书
4. 客户端兼容性:为兼容老旧设备同时提供RSA和ECC两种加密算法的证书
这些场景都要求服务器能够处理多个SSL证书。幸运的是,Nginx完美支持这种需求。
基础方案:基于Server块的SNI配置
最常见的多证书配置方式是使用Server Name Indication(SNI)技术。简单来说,就是让客户端在TLS握手时告诉服务器它想访问哪个域名,服务器再返回对应的证书。
```nginx
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /path/to/domain1.crt;
ssl_certificate_key /path/to/domain1.key;
其他配置...
}
server_name domain2.com;
ssl_certificate /path/to/domain2.crt;
ssl_certificate_key /path/to/domain2.key;
```
这种方式的优点是:
- 配置简单直观
- 每个域名有完全独立的配置
- 支持通配符和多域名(SAN)证书
但要注意:
- 需要客户端支持SNI(现代浏览器都支持)
- IE6/WinXP等老旧系统可能不兼容
进阶方案:单Server块多域名多证书
如果你需要在同一个server块中处理多个域名的不同证书,可以这样:
SSL通用配置
ssl_protocols TLSv1.2 TLSv1.3;
默认使用的第一个域名的SSL信息
server_name domain1.com domain2.com;
domain1的SSL信息放在前面作为默认值
ssl_certificate /path/to/domain1.crt;
domain2的特定SSL信息通过变量动态加载
if ($host = "domain2.com") {
set $ssl_certificate "/path/to/domain2.crt";
set $ssl_certificate_key "/path/to/domain2.key";
rewrite ^(.*)$ $1 break;
dummy rewrite to apply variables
}
这种方法更灵活但稍复杂。适用于:
- API网关需要根据请求头选择不同后端和对应证书
- CDN边缘节点需要动态选择源站证书
SAN/UCC多域名统一解决方案
如果你管理大量子域名又不想维护太多独立证书,可以考虑SAN(Subject Alternative Name)或UCC(Unified Communications Certificate)多域名通配符:
SAN/UCC通配符解决方案示例:
情况一: SAN单证书记录所有子域:
*.example.com + example.com
情况二: UCC单证书记录5个特定子域:
www.example.com, api.example.com, mail.example.com,
shop.example.com, blog.example.com
情况三: SAN+通配符混合:
*.example.com + example.net + example.org
对应nginx只需一个cert/key对:
ssl_certificate /path/to/multi_domain.crt;
ssl_certificate_key /path/to/multi_domain.key;
优势很明显:
- 简化管理(只需更新一个cert/key对)
- Let's Encrypt等CA提供免费SAN支持(最多100个域名)
ECC+RSA双算法混合部署案例
为了兼顾安全性和兼容性,我们可以同时部署ECC和RSA两种算法的密钥对:
listen 443 ssl;
RSA部分 (兼容老设备)
ssl_certificate /etc/ssl/certs/rsa.pem;
ssl_certificate_key /etc/ssl/private/rsa.key;
ECC部分 (现代浏览器首选)
ssl_certificate /etc/ssl/certs/ecc.pem;
ssl_certificate_key /etc/ssl/private/ecc.key;
SSL优化参数 (优先使用ECC)
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;
RSA+ECC混合密码套件列表
...
这样做的结果是:
- Chrome/Firefox等现代浏览器会优先协商ECDHE_ECDSA连接(更安全快速)
- IE8等老浏览器会回退到ECDHE_RSA或纯RSA连接(保证可用性)
ACME自动化与通配符实践技巧
结合Let's Encrypt的ACME协议实现自动化管理:
```bash
certbot示例 - SAN通配符申请命令:
certbot certonly --manual --preferred-challenges=dns \
-d '*.example.com' -d example.com \
--rsa-key-size 4096 --ecc --must-staple \
--key-type ecdsa --elliptic-curve secp384r1
nginx reload钩子示例:
echo "0 */12 * * * root certbot renew --quiet && systemctl reload nginx" > \
/etc/cron.d/certbot-renewal
关键点:
- `--ecc`参数生成ECC密钥对(节省资源提高性能)
- `--must-staple`启用OCSP装订(提升TLS握手速度)
- `--rsa-key-size`指定传统RSA密钥长度(4096位更安全)
HTTP3与TLS13新特性前瞻
随着HTTP3的普及,Nginx官方实验模块已支持QUIC协议的多证书记录:
```nginx
http3模块示例 (实验性功能)
listen [::]:443 quic reuseport;
listen [::]:443 http3 reuseport;
TLSv13专用参数 (OpenSSL ≥ v3.x)
ssl_conf_command Options KTLS;
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
HTTP3特有的0-RTT优化设置 (需权衡安全性)
add_header Alt-Svc 'h3=":443"; ma=86400';
ssl_early_data on;
这些前沿特性包括:
- QUIC协议内置TLS1.3实现(减少握手延迟)
- KTLS内核级加速(降低CPU开销)
- Zero-RTT快速恢复连接(提升移动端体验)
Nginx多证书记录的性能考量
当部署大量证书记录时需要注意:
```bash
openssL速度测试比较命令示例:
openssl speed rsa2048 rsa4096 ecdsap256
nginx worker内存占用估算公式:
预计内存 ≈ (RSA密钥大小 × worker数) + (ECC密钥大小 × worker数) + SSL会话缓存
例如:
4 workers × (4MB RSA + 0.5MB ECC) +50MB缓存 ≈ ~70MB额外内存占用
SSL会话复用优化参数:
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
建议监控指标包括:
TAG:nginx可以有多个ssl证书吗,nginx 多个,nginx配置多个ssl证书,nginx 多个证书,nginx能做几层代理