## 症状现象
证书到期前换了新证书,文件确认更新,浏览器与检测工具却仍显示旧证书与旧到期日。个别用户开始看到证书过期告警。文件是新的、对外服务的是旧的,中间断了一环:正在运行的服务进程还把旧证书攥在手里。
## 定位过程
证书在服务启动或重载时载入内存,替换磁盘文件不影响已加载的内容,这是机制而非故障。定位就是找哪一层没刷新。第一层本机服务:确认部署路径与服务实际引用的配置是否一致,配置改了路径而证书放错地方的情形很常见。第二层多实例:负载均衡后面四台机器只更新了两台,轮流访问时新旧交替。第三层接入层:CDN 或高防类接入的证书在平台侧配置,源站更新不等于接入层更新。第四层缓存:个别中间设备缓存了旧的握手信息。
openssl s_client -connect 127.0.0.1:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates for h in 192.168.10.2 192.168.10.3 192.168.10.4; do echo $h; openssl s_client -connect $h:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate; done
逐台直连查询证书到期日,哪台返回旧日期,问题就在哪台。
## 解决方法
按层处理:本机服务执行平滑重载而非硬重启,Web 服务普遍支持热加载证书;多实例环境把证书分发与重载做成脚本,一次覆盖全部节点;接入层在平台控制台同步更新证书。完成后逐台复验,对外域名再从外部复验一次,全部一致才算完成。
## 预防建议
证书变更清单里固化三步:更新、重载、外部验证,验证要查到期日而不是只看文件。顺云云服务器多机部署的证书管理用脚本统一分发,任何一台遗漏都会在复验环节暴露。
证书分发的自动化是根治方向:把证书文件、私钥与重载动作打包成发布项,配置管理工具统一分发,机器清单里逐台核销。半自动的分发总会有漏网的那台,自动化之后漏发变成告警而不是事故。轮换周期与告警提前量都写进日历,证书从紧急变更变成例行操作。顺带把重载动作做成幂等的,重复执行无副作用。