通配符SSL证书在Nginx中支持多域名需满足:证书覆盖所有域名(如*.example.com仅匹配单层子域,根域和多级子域须单独添加至SAN);各server块共用同一证书路径并正确配置ssl_certificate与ssl_certificate_key;验证后重载生效。

在 Windows 下用 Nginx 配置多个域名共用一个通配符 SSL 证书,核心在于:证书必须覆盖所有目标域名(如 *.example.com 能匹配 a.example.com、b.example.com,但不能匹配 example.com 或 sub.test.com),且 Nginx 的每个 server 块需正确引用同一组证书文件,并启用 SNI 支持(现代 Nginx 默认开启,无需额外配置)。
确认通配符证书覆盖范围
通配符证书只匹配**单层**子域名。例如:
-
*.example.com✅ 可用于www.example.com、api.example.com、shop.example.com -
*.example.com❌ 不可用于example.com(根域需单独添加到证书的 Subject Alternative Names 中) -
*.example.com❌ 不可用于dev.api.example.com(二级子域名不匹配)
若需支持根域,申请证书时务必勾选或显式添加 example.com 到 SAN 列表;若需多级子域,应使用多通配符(如 *.api.example.com)或泛域名证书服务(如 Let’s Encrypt 不支持多级通配符,需拆分为多个证书)。
整理证书文件并统一存放
将通配符证书的私钥(example.com.key)、完整证书链(example.com.pem,含域名证书 + 中间证书,推荐合并为单文件)放在 Nginx 安装目录下的固定路径,例如:conf/ssl/example.com.keyconf/ssl/example.com.pem
确保文件权限合理(Windows 下主要避免被系统或杀软误删/拦截),路径中不含中文或空格。
为每个域名配置独立 server 块
在 nginx.conf 或 conf/vhosts/ 下的分站点配置文件中,为每个子域写一个 server 块,全部指向同一证书路径,并启用 HTTPS 和 SSL:
server {
listen 443 ssl http2;
server_name www.example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate conf/ssl/example.com.pem;
ssl_certificate_key conf/ssl/example.com.key;
# 其他配置(root、location 等)
root html/www;
index index.html;}
server { listen 443 ssl http2; server_name api.example.com;
ssl_certificate conf/ssl/example.com.pem; ssl_certificate_key conf/ssl/example.com.key; root html/api; index index.html;
}
注意:
- 每个 server_name 必须是该证书 SAN 中明确包含的域名;
- 不要重复定义 listen 443 ssl 多次(Nginx 允许,但易出错),保持各块独立清晰即可;
- 若还需 HTTP 自动跳转 HTTPS,为每个域名补充对应 80 端口的 server 块,用 return 301 https://$host$request_uri;。
验证配置并重载服务
执行以下步骤确保生效:
- 运行
nginx -t检查语法和证书路径是否可读(常见报错:cannot load certificate多因路径错、权限受限或 PEM 格式损坏) - 若通过,执行
nginx -s reload平滑重载配置 - 用浏览器访问
https://www.example.com和https://api.example.com,点击地址栏锁图标确认证书信息中显示正确的域名列表 - 也可用命令行工具验证:
openssl s_client -connect www.example.com:443 -servername www.example.com | openssl x509 -noout -text,查看X509v3 Subject Alternative Name字段
不复杂但容易忽略细节。

















