Nginx 中多个域名共用同一 SSL 证书的推荐方式是使用 SAN 多域名证书,并将所有域名写在同一 server 块的 server_name 中,统一指定 ssl_certificate 和 ssl_certificate_key 路径。

Nginx 中让多个域名共用同一个 SSL 证书,最常见且推荐的方式是使用多域名证书(SAN 证书),即一张证书里包含多个域名(Subject Alternative Names)。这种配置不需要 SNI 多证书切换逻辑,也不依赖客户端是否支持 SNI,兼容性更好。
以下是在 nginx.conf(或站点配置文件)中实现该目标的关键步骤和写法:
确认证书已覆盖全部目标域名
拿到的证书必须在 SAN 字段中明确列出所有要使用的域名,例如:
DNS Name=example.com, DNS Name=www.example.com, DNS Name=shop.example.com, DNS Name=blog.other.net
注意:通配符证书(如 *.example.com)不能跨主域使用,也不能自动包含根域(example.com),必须显式添加。
统一指定证书路径,多个域名写在同一 server 块
把所有共用该证书的域名,全部写进同一个 server 块的 server_name 指令中:
- 确保
listen 443 ssl http2;已启用(ssl关键字不可省) -
server_name后跟空格分隔的所有域名,顺序无关,但需与证书 SAN 完全一致(大小写不敏感,但建议小写) -
ssl_certificate和ssl_certificate_key只需各写一次,指向同一组文件
示例配置:
server {
listen 443 ssl http2;
server_name example.com www.example.com shop.example.com blog.other.net;
<pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/multi-domain.crt;
ssl_certificate_key /etc/nginx/ssl/multi-domain.key;
# 推荐:合并中间证书到 .crt 文件末尾,避免信任链断裂
# 即 multi-domain.crt = 域名证书 + 中间 CA 证书(顺序不能错)
location / {
root /var/www/example;
index index.html;
}}
补充 HTTP 跳转和默认行为
为每个域名提供 HTTP → HTTPS 重定向,可单独写 server 块(非必需,但推荐):
- 每个
server { listen 80; server_name ... }块内加return 301 https://$host$request_uri; - 或统一用一个
server { listen 80; server_name _; }捕获所有未匹配的 80 请求并跳转
验证证书是否生效
不要只靠浏览器访问——缓存、CDN 或 HSTS 可能掩盖问题。用 OpenSSL 直接验证:
openssl s_client -connect your.ip:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"- 应看到全部你声明的域名出现在 SAN 列表中
- 换不同
-servername参数再试,结果应一致(因为是同一张证书)


















