多个域名共享同一主证书文件的本质是使用一张san证书,即在申请时将所有域名(如example.com、www.example.com等)统一写入subject alternative name字段,由ca签发为单个含完整链的pem文件,nginx通过一个server块加载该证书即可支持全部域名;跨主域则必须分server块配独立证书。

多个域名共享同一个主证书文件,本质是用一张SAN 证书(Subject Alternative Name),而不是让不同域名“共用”多张独立证书。Nginx 本身不支持一个 ssl_certificate 指令加载多个域名的独立证书,强行合并不同域名的 leaf 证书会导致 TLS 握手失败或浏览器报错。
必须用 SAN 证书,不是通配符或拼凑
一张有效的 SAN 证书可同时覆盖多个域名,比如:example.com、www.example.com、shop.example.com、api.example.com
这些域名在申请时就写在同一张证书里,由 CA 签发为一个完整 PEM 文件(含所有域名的公钥 + 中间链),Nginx 只需加载这一个文件即可。
- Let’s Encrypt 默认走的就是 SAN 模式,宝塔面板「添加更多域名」功能背后就是生成 SAN 证书
- 不能把
example.com.crt和another.net.crt手动合并进同一个 PEM 文件——它们属于不同私钥和签发主体,TLS 层会拒绝 - 通配符证书(如
*.example.com)只适用于同主域下的单层子域,不等于 SAN,也不能覆盖根域或跨主域
配置方式:单个 server 块 + 完整 SAN 证书路径
只要所有域名都属于同一张 SAN 证书,就可以放在同一个 server 块里,共用一套 SSL 配置:
-
server_name example.com www.example.com shop.example.com;—— 列出证书中包含的所有域名 -
ssl_certificate /path/to/fullchain.pem;—— 必须是包含全部域名证书 + 中间链的完整文件 -
ssl_certificate_key /path/to/privkey.pem;—— 对应的私钥(仅一份,对应整个 SAN 证书) -
listen 443 ssl http2;—— 开启 SSL 和 HTTP/2 支持
常见错误要避开
很多人试图“复用证书路径”却忽略关键前提:
- 把
site-a.com的证书路径硬写给site-b.net的server块 → 浏览器报NET::ERR_CERT_COMMON_NAME_INVALID - 在宝塔里给一个站点填多个主域(如
example.com和another.net)→ Let’s Encrypt 直接拒绝签发 - 手动合并两个不同域名的
.crt文件 → Nginx 启动不报错,但客户端握手时无法验证签名链
如果域名跨主域,只能分 server 块
例如需要同时支持 example.com 和 another.net:
- 必须准备两张独立证书(或两张 SAN 证书)
- 各自配置独立的
server块,分别绑定server_name和对应的ssl_certificate路径 - Nginx 依赖 SNI 在 TLS 握手初期识别域名,再匹配对应证书 —— 这才是多域名 HTTPS 共存的标准做法











