自建监控每天检查站点证书的到期时间,主证书还有 200 天。实际中间证书上周已经过期,部分抓取节点握手失败,监控一直显示正常,因为脚本只读了服务端返回的第一张证书。

一开始怀疑是「浏览器缓存了旧链 用户侧没有感知」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。监控脚本只解析服务端返回的第一张证书。也可能是中间证书由 CA 单独签发 到期时间不同。

另外,告警只比对天数 没有校验链完整性。

动手时先打印完整证书链的到期时间

openssl s_client -showcerts -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -dates

再往下把链里的证书逐张拆出来

openssl s_client -showcerts -connect www.example.com:443 </dev/null 2>/dev/null | awk '/BEGIN CERT/{n++} {print > "cert" n ".pem"}'

接着逐张检查到期日

for f in cert*.pem; do openssl x509 -in $f -noout -enddate; done

更新 fullchain 并重载

cat site.crt intermediate.crt > fullchain.pem && nginx -s reload

改完先别撤,确认这几项。监控能列出链里每张证书的到期日,中间证书续期后握手恢复正常。

补一句。证书监控要覆盖整条链,只看主证书会漏掉最先过期的中间证书。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189