为了避免停机,证书在到期前一天才替换,换完浏览器正常,蜘蛛却连续两天报证书校验失败,日志里能看到 TLS 握手被中断。
真正麻烦的地方在于,几个原因的现象几乎一样。CDN 边缘节点还缓存着旧证书,回源与边缘不一致;新旧证书的中间链不同,客户端缓存了旧的中间证书;OCSP 响应没刷新,校验时拿到的是旧状态;部分节点没做证书热加载,需要重启才生效。
从不同节点看证书序列号
for ip in 1.1.1.1 8.8.8.8; do echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -serial; done
随后确认证书链是否完整
openssl s_client -connect www.example.com:443 -showcerts </dev/null 2>/dev/null | grep 's:'
刷新 CDN 证书并重载服务
nginx -s reload
复测握手结果
curl -sI https://www.example.com/ -o /dev/null -w '%{http_code}'
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
别只看报错消失,验证要多做一步。各节点证书序列号一致,蜘蛛握手恢复成功,抓取错误在两小时内清零。
换证书要留出至少一周的重叠期,让旧链自然过期,临期替换最容易撞上缓存。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
