文档中心
Nginx閰嶇疆澶氫釜鍩熷悕SSL璇佷功瀹炴垬鎸囧崡瀹夊叏鍙堢渷蹇?txt
时间 : 2025-09-27 16:27:53浏览量 : 4

在今天的互联网环境中,SSL/TLS证书(即HTTPS加密)已成为网站安全的标配。但对于运维人员来说,如果一台服务器上托管了多个网站(比如 `blog.example.com` 和 `shop.example.com`),如何高效地为每个域名配置独立的SSL证书?本文将用最通俗的语言+实战案例,带你玩转Nginx多域名SSL配置。
一、为什么需要多域名SSL证书?
假设你的服务器同时运行以下服务:
- 主站:`www.company.com`
- API接口:`api.company.com`
- 客户后台:`dashboard.company.com`
如果只用一个通配符证书(`*.company.com`),虽然能覆盖所有子域名,但存在两个问题:
1. 安全风险:一旦私钥泄露,所有子域名都会受影响。
2. 合规需求:某些行业(如金融)要求每个子域名使用独立证书。
二、两种主流解决方案
方案1:单IP多证书(SNI技术)
原理:通过SNI(Server Name Indication)技术,在TLS握手阶段告诉服务器“我要访问哪个域名”,Nginx再返回对应的证书。
优势:无需为每个域名分配独立IP,节省成本。
配置示例:
```nginx
server {
listen 443 ssl;
server_name blog.example.com;
ssl_certificate /path/to/blog.crt;
博客域名的证书
ssl_certificate_key /path/to/blog.key;
其他配置...
}
server_name shop.example.com;
ssl_certificate /path/to/shop.crt;
商城域名的证书
ssl_certificate_key /path/to/shop.key;
```
> ? 适用场景:现代浏览器均支持SNI(IE6等老旧浏览器除外)。
方案2:多IP多证书
原理:为每个域名分配独立的IP地址,Nginx根据IP地址选择对应的证书。
优势:兼容性100%,适合需要支持老旧系统的场景。
listen 192.0.2.1:443 ssl;
IP1绑定blog.example.com
ssl_certificate /path/to/blog.crt;
listen 192.0.2.2:443 ssl;
IP2绑定shop.example.com
ssl_certificate /path/to/shop.crt;
三、避坑指南
坑1:证书链不完整
? 错误现象:浏览器提示“此连接非完全安全”。
? 解决方法:确保证书文件包含中间CA证书。合并命令示例:
```bash
cat domain.crt intermediate.crt > fullchain.crt
坑2:HTTP/2兼容性问题
? 错误现象:Nginx报错 `invalid ALPN protocol "http/1.1"`。
? 解决方法:在监听端口后明确声明协议:
listen 443 ssl http2;
注意http2参数
坑3:默认证书陷阱
如果请求的域名不匹配任何 `server_name`,Nginx会返回第一个定义的证书。建议添加一个默认拦截:
listen 443 default_server ssl;
ssl_certificate /path/to/default.crt;
return 444;
直接关闭连接
四、高级技巧
技巧1:OCSP Stapling加速
通过缓存证书状态查询,减少HTTPS握手时间:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
技巧2:自动化续签(Let's Encrypt)
使用Certbot自动为多域名续签:
certbot --nginx -d blog.example.com -d shop.example.com --expand
五、表格对比
| 方案 | SNI多证书 | 多IP多证书 |
||-|-|
|成本 |低(共用IP)|高(需额外IP)|
|兼容性 |现代浏览器 |所有设备 |
|适用场景 |90%的Web业务|金融/***系统|
如果你是中小型企业,优先选择SNI方案;若涉及敏感数据且预算充足,则考虑多IP绑定。
通过本文的实战案例和避坑指南,你应该能轻松驾驭Nginx的多域名SSL配置了!如果有疑问,欢迎在评论区交流讨论~ ??
TAG:nginx多个域名ssl证书,nginx 配置多个域名 指向同一个服务,nginx配置多域名代理访问,nginx配置多个域名 servername,nginx 多个域名