是的,你的理解完全正确。一张包含正确SAN(Subject Alternative Name,主题备用名称) 的SSL证书,配合正确的Nginx配置,就可以同时保护 `example.com` 和 `www.example.com`。
具体配置的核心思路是:使用一张SAN证书,并在Nginx的单个`server`块中,通过`server_name`指令同时声明这两个域名。
一、Nginx配置示例
这是一个标准的配置示例:
```nginx
server {
listen 80;
server_name example.com www.example.com;
# 将所有HTTP请求重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com; # 关键:在此列出所有域名
# 指向你的SAN证书和私钥
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/private.key;
# 其他SSL配置(TLS版本、加密套件等)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# ... 网站根目录等配置
}
```
关键点解析:
证书文件:`ssl_certificate` 和 `ssl_certificate_key` 指令指向你的SAN证书文件,只需指定一次,供所有列出的域名共用。
`server_name`:在`server`块中,用空格分隔列出所有需要保护的域名,如 `example.com www.example.com`。
HTTP 跳转:建议额外配置一个监听80端口的`server`块,将所有HTTP请求永久重定向(301)到HTTPS版本,提升安全性。
二、核心要点与避坑指南
1. 确保证书SAN字段包含所有域名:这是最关键的一步。你需要确保在申请证书时,将 `example.com` 和 `www.example.com` 都添加到SAN列表中。
验证方法:可以使用以下命令查看证书的SAN字段,确认是否包含所有目标域名。
```bash
openssl x509 -in /path/to/your/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
```
正确的输出应类似:`DNS:example.com, DNS:www.example.com`。
2. 关于通配符证书的提醒:
通配符证书(如 `*.example.com`)不能自动保护根域名 `example.com`。
因此,若想同时保护这两个域名,必须使用SAN证书,并将根域名 `example.com` 显式加入SAN列表。
3. 配置风格选择:
单个`server`块(推荐):将多个域名写在同一个`server_name`中,配置最简洁,不易出错。
多个`server`块:也可以为每个域名建立独立的`server`块并指向相同的证书文件。这种方式更灵活,但配置稍显冗余。
三、总结
总而言之,要同时保护 `example.com` 和 `www.example.com`,你的操作步骤是:
1. 申请证书:向证书颁发机构(CA)申请一张SAN证书,务必在申请时同时填写 `example.com` 和 `www.example.com`。
2. 配置Nginx:在Nginx配置文件中,将这两个域名都写在同一个`server`块的`server_name`指令里,并指向你申请到的证书文件。
3. 验证与重载:使用 `nginx -t` 测试配置无误后,执行 `nginx -s reload` 使其生效。
完成这三步,就可以用一张证书安全地保护你的主域名和www子域名了。