记录一下那天晚上的排查过程。一台 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,访问者拿到的就是别人的证书。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
