nginx通过sni机制实现多域名证书隔离,核心是每个server块绑定专属证书路径与精确server_name;单块多域名需证书san全覆盖,多块则须严格一一对应,禁用通配符server_name和混用证书路径。

Nginx 中 server_name 本身不直接“绑定”SSL证书,而是通过与 ssl_certificate 和 ssl_certificate_key 的组合,在 SNI(Server Name Indication)机制下实现多域名对应各自证书。关键不是让一个 server_name 管多个证书,而是每个 server_name(或一组域名)应匹配一个专属的证书路径。
下面分几种常见场景说明配置逻辑和实操要点:
单个 server 块支持多个域名共用一张证书
适用于 SAN 证书(多域名证书)或通配符证书(如 `*.example.com` + `example.com` 同时包含在 SAN 中):server {
listen 443 ssl http2;
server_name example.com www.example.com api.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 其他配置...
}
- 所有 `server_name` 列出的域名,必须全部出现在该证书的 Subject Alternative Names(SAN)列表中
- 通配符 `*.example.com` 只覆盖单层子域,根域 `example.com` 需显式加入 SAN 才能生效
- 不能靠 `server_name` “触发”不同证书——证书路径是固定的,只有一组
多个 server 块分别绑定不同域名和不同证书
这是最推荐、最清晰、最易维护的方式(即“一域一证一 block”):server {
listen 443 ssl http2;
server_name site-a.com www.site-a.com;
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;
}
server {
listen 443 ssl http2;
server_name site-b.net api.site-b.net;
ssl_certificate /etc/letsencrypt/live/site-b.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-b.net/privkey.pem;
}
- 每个 `server_name` 行只写当前证书合法覆盖的域名,避免混入未授权域名
- 两个块可共用同一 IP 和 443 端口,SNI 会在 TLS 握手时自动选对证书
- 绝对不要在一个 block 里写多个 `ssl_certificate` 指令——Nginx 不识别,会报错或静默失效
server_name 配置常见错误提醒
- 写成 `server_name *.example.com` —— Nginx 不支持通配符语法匹配,应写具体域名,通配符由证书本身决定
- 把 `example.com` 和 `another.com` 放进同一个 `server_name` 并指望一张证书覆盖——除非证书明确包含二者,否则浏览器会提示域名不匹配
- 多个 server 块共用同一组证书路径,但 `server_name` 却指向完全无关的域名(如 `site-a.com` 和 `site-b.net` 都用 `site-a.com` 的证书)——虽不报错,但 `site-b.net` 访问时会因证书域名不匹配而触发安全警告
- 忽略大小写或拼写:`Server_Name` 或 `server_name www.example.com.`(末尾点)都可能导致匹配失败
验证是否生效
用 OpenSSL 快速检查 SNI 是否正确返回对应证书:openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "DNS:"确保输出中列出的 DNS 条目包含 `example.com`;换域名再试一次,应看到不同证书内容。
不复杂但容易忽略











