报错是这么冒出来的。换证书时把中间证书和站点证书的顺序写反,浏览器能打开,必应抓取报 SSL 握手失败,百度侧日志正常。用 openssl 检查发现证书链里第一张不是站点证书。
中间走过弯路,把「Nginx 的 ssl_certificate 指向了 cert 而不是 fullchain」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。fullchain 文件顺序错误 第一张必须是站点证书。还有一种是部分客户端会自行补链 掩盖了配置问题。
还有一种情况,旧证书还残留在证书文件里。
上来先检查服务端返回的第一张证书
openssl s_client -connect www.example.com:443 -servername www.example.com | openssl x509 -noout -subject
然后列出链里每一张证书的主题
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout
接着按站点证书到中间证书的顺序重排
cat site.crt intermediate.crt > fullchain.pem
末了用必应 UA 复验握手
curl -s -o /dev/null -w '%{http_code}\n' -A 'bingbot' https://www.example.com/
别只看报错消失,验证要多做一步。openssl 输出的第一张是站点证书,必应抓取不再报握手失败。
容易忽略的是,浏览器容错高,抓取器容错低,证书链顺序这类问题只能靠命令行验证。这类问题最好一次改到位,反复小改反而容易把原因搅混。
