一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何排查 Nginx 加载通配符泛域名 SSL 证书时出现的匹配错误

时间:2026-08-20 12:11:49 编辑:袖梨 来源:一聚教程网

通配符证书在Nginx中“看似能用、实际错配”的根源在于证书覆盖范围、server块隔离与SNI分发逻辑未对齐:需验证SAN含DNS:example.com和DNS:*.example.com,每个域名独占server块,使用fullchain.pem,抓包确认SNI匹配目标域名。

通配符证书在 Nginx 中“看似能用、实际错配”是高频问题,根源不在证书本身,而在域名覆盖范围、server 块隔离和 SNI 分发逻辑是否对齐。排查要从证书能力边界出发,逐层验证 Nginx 是否真把对的证书交给了对的请求。

确认通配符证书实际覆盖哪些域名

通配符 *.example.com 仅匹配一级子域名,不自动包含根域或二级以上子域。必须用命令检查证书 SAN 列表:

  1. 运行 openssl x509 -in conf/ssl/example.com.fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
  2. 输出中必须显式列出 DNS:example.com(根域)和 DNS:*.example.com;若需支持 dev.api.example.com,则必须有 DNS:dev.api.example.comDNS:*.api.example.com
  3. 如果缺失,即使配置正确,浏览器也会报“证书与域名不匹配”——这不是 Nginx 配置问题,而是证书申请时漏填 SAN

检查每个域名是否独占一个 server 块

Nginx 不会根据 Host 头自动挑选证书。把多个域名写进同一个 server_name 列表(如 server_name a.com b.com;),会导致 SNI 握手阶段无法精准绑定,浏览器可能拿到其他域名的证书。

  1. www.example.comapi.example.comexample.com 各自建独立 server
  2. 每个块内只写一个 server_name,并指向同一份 fullchain.pemprivkey.pem
  3. 确保所有块都监听 listen 443 ssl,且未启用 default_server 冲突

验证证书链是否完整且路径正确

只配 cert.pem 是常见错误。现代浏览器要求服务器返回完整链(自身证书 + 中间证书),否则握手失败或显示不安全警告。

  1. 配置中必须使用 ssl_certificate conf/ssl/example.com.fullchain.pem(不是 cert.pem
  2. 私钥路径对应,且权限设为 600(Linux)或防杀软拦截(Windows)
  3. 执行 nginx -t 确认语法通过,再 nginx -s reload,避免配置未生效

抓包确认 SNI 是否发送正确域名

浏览器访问 https://api.example.com 时,Nginx 必须在 TLS 握手阶段向客户端声明 SNI = api.example.com,否则客户端可能缓存或 fallback 到默认证书。

  1. 用 Chrome 开发者工具 → Security 标签页,查看“证书”详情里的“颁发给”是否为当前域名
  2. 更准的方法:用 Wireshark 抓本地到服务器的 443 流量,过滤 tls.handshake.type == 1,查看 Client Hello 中的 SNI 字段值
  3. 若 SNI 显示为其他域名(如 www.example.com),说明某个 server 块被意外设为 default_server,或 DNS 缓存/Hosts 文件干扰了请求目标

热门栏目