Nginx 为不同域名配置独立 SSL 证书需为每个域名设独立 server 块,分别指定 ssl_certificate 和 ssl_certificate_key 的绝对路径,确保私钥权限为 600,并通过 SNI 实现证书分发。

在 Nginx 中为不同域名配置独立的 SSL 证书,关键在于每个 server 块中正确声明 ssl_certificate 和 ssl_certificate_key,并确保 SNI(Server Name Indication)正常工作——现代浏览器和客户端均支持,无需额外开启。
域名与证书一一对应配置
每个基于域名的虚拟主机必须有自己独立的 server 块,并在其中指定专属证书路径。不能多个域名共用一个 server 块再靠 if ($host) 切换证书,Nginx 不支持运行时动态加载证书。
- 为
example.com单独写一个server块,监听 443 端口,server_name example.com;,并配置其证书文件路径 - 为
blog.example.com再写一个server块,同样监听 443,server_name blog.example.com;,指向另一套证书 - 证书路径建议使用绝对路径,避免因 Nginx 工作目录不确定导致加载失败
证书文件准备与权限检查
每套证书需包含公钥(.crt 或 .pem)和私钥(.key),私钥必须严格限制读写权限(推荐 600),否则 Nginx 启动会报错。
- 执行
chmod 600 /etc/nginx/ssl/blog.example.com.key确保私钥安全 - 可将所有证书统一放在
/etc/nginx/ssl/下,按域名命名,如example.com.crt、example.com.key - 用
openssl x509 -in example.com.crt -text -noout | grep "Subject:验证证书主体是否匹配域名
HTTP 自动跳转与默认 server 处理
为避免未匹配域名的请求落入错误配置,建议显式定义一个“兜底” HTTPS server,返回 444(关闭连接)或重定向到主站;同时每个域名都应配置对应的 HTTP server,强制 301 跳转到 HTTPS。
- HTTP server 中使用
return 301 https://$host$request_uri;实现无条件跳转 - 可设置一个
server { listen 443 ssl default_server; server_name _; return 444; }拦截非法 SNI 请求 - 若使用 Let’s Encrypt,推荐用
certbot --nginx -d example.com -d www.example.com自动配置多域名证书,但跨域名仍需分开管理
验证与热重载
配置完成后务必语法检查 + 测试重载,再用外部工具确认证书是否生效。
- 运行
nginx -t检查配置合法性,成功后再nginx -s reload - 用浏览器访问
https://example.com和https://blog.example.com,点击锁图标查看证书详情,确认颁发对象一致 - 命令行验证:
curl -I --resolve example.com:443:你的IP https://example.com,配合openssl s_client -connect example.com:443 -servername example.com查看协商证书
只要每个 server 块绑定明确域名、证书路径准确、私钥权限合规,Nginx 就能通过 SNI 正确分发对应证书。不复杂但容易忽略细节。

















