Nginx多域名SSL配置错误本质是证书与配置不匹配,需按域名关系分三类处理:①同主域用SAN/通配符证书+单server块;②跨主域须分设独立server块配专属证书;③加default_server防IP或SNI缺失时证书泄露。

Nginx 多个域名共享 SSL 证书报错,本质不是“共享”本身出错,而是配置方式与证书类型不匹配导致的证书不匹配警告(如浏览器提示“您的连接不是私密连接”“NET::ERR_CERT_COMMON_NAME_INVALID”)。关键在于:HTTPS 下不能靠一个 server 块 + 多个 server_name 来“共享”不同域名的独立证书;必须按证书覆盖范围选择正确配置模式。
以下分三类典型场景,给出直接可落地的解决路径:
✅ 场景一:多个域名属于同一主域(如 www.example.com、api.example.com、shop.example.com)
用通配符证书或 SAN 证书,单 server 块即可支持
- 申请时明确包含全部子域名:
certbot certonly --nginx -d example.com -d www.example.com -d api.example.com -d shop.example.com
- Nginx 配置中只需一个 HTTPS server 块,
server_name可空格列出所有域名:server { listen 443 ssl http2; server_name example.com www.example.com api.example.com shop.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 其他SSL参数... } - ✅ 成功前提:证书的 SAN(Subject Alternative Name)字段必须完整包含
server_name中每个域名(大小写不敏感,但拼写必须一致)。
✅ 场景二:多个完全独立的主域(如 site-a.com 和 site-b.net)
必须分设独立 server 块,各配专属证书
❌ 错误做法:把两个域名写在一个 server 块里,再配两套
ssl_certificate(Nginx 只认最后一个)-
✅ 正确做法:每个域名一个 server 块,路径、证书、私钥全隔离
linux-performance-analyzer下载Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
# site-a.com server { listen 443 ssl http2; server_name site-a.com; ssl_certificate /etc/nginx/certs/site-a.com/fullchain.pem; ssl_certificate_key /etc/nginx/certs/site-a.com/privkey.pem; # ... } # site-b.net server { listen 443 ssl http2; server_name site-b.net; ssl_certificate /etc/nginx/certs/site-b.net/fullchain.pem; ssl_certificate_key /etc/nginx/certs/site-b.net/privkey.pem; # ... } -
⚠️ 注意:
- 所有
listen 443 ssl必须显式写出,不能省略ssl; - 每个块的
ssl_certificate路径必须指向该域名专用证书,不可复用或共用目录; -
server_name必须精确匹配证书 SAN 列表中的某一项(例如证书没含www.site-a.com,就别写server_name www.site-a.com)。
- 所有
✅ 场景三:访问 IP 或未配置域名时出现“错误证书”(如显示了 site-b.net 的证书)
这是默认 server 接管导致的证书泄露,需加兜底防护
- 在所有业务 server 块之前(推荐放在
http{}最顶部),添加一个显式的 default_server:server { listen 443 ssl default_server; server_name _; ssl_certificate /etc/nginx/ssl/ip-only.crt; # 仅含服务器IP的自签名证书 ssl_certificate_key /etc/nginx/ssl/ip-only.key; return 444; # 静默断连,不返回任何响应 } - ✅ 效果:
- curl https://www.php.cn/link/487a927f745a1a5362436f97ecac2067 或老设备无 SNI 请求,不再暴露任意业务证书;
- 防止 Censys/Shodan 扫描将你的公网 IP 关联到某个租户域名;
- 避免因配置顺序错乱导致意外 fallback。
验证是否生效,用这条命令直击 TLS 握手层:
openssl s_client -connect your-server-ip:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "DNS:"
输出中 DNS: 行应只含 site-a.com 及其 SAN 域名,不含其他无关域名。
不复杂但容易忽略

















