记录一下那天晚上的排查过程。一台 Nginx 1.24 上挂了十几个站点,其中两个只写了 listen 443 没写 server_name,访问时返回的是默认站证书。Search Console 报证书名称与网址不匹配,这两个站收录全停。

刚开始盯着「旧客户端不支持 SNI,只能用第一张证书」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。443 端口没有匹配到 server_name 时回落到 default_server 的证书。也可能是站点块只配了证书路径,没有声明自己的域名。

不容易想到的是,证书文件里本来就漏了这几个域名。

指定域名看返回哪张证书

openssl s_client -connect 203.0.113.10:443 -servername www.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject

接着列出所有 443 站点块

nginx -T | grep -n 'listen 443'

给每个站点补 server_name

sed -i 's/listen 443 ssl;/listen 443 ssl; server_name www.example.com;/' /etc/nginx/conf.d/site.conf

复核证书里的备用名称

openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -text | grep -A1 'Subject Alternative Name'

别只看报错消失,验证要多做一步。每个域名都能拿到自己的证书,Search Console 的证书错误消失,两个站的抓取在三天内恢复。

容易忽略的是,SNI 让一个 IP 挂多张证书成为可能,但只要漏写 server_name,访问者拿到的就是别人的证书。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189