HTTPS 证书过期导致服务中断排查手册
证书过期是最容易被忽视、却最容易造成全站中断的故障之一。浏览器报错通常是 NET::ERR_CERT_DATE_INVALID,App 与 API 客户端则直接拒绝连接,CDN 回源健康检查失败还可能把节点摘除,造成连锁 502。本文给出可直接照做的排查手册。
一、先定性:是不是证书问题
1. 浏览器打开故障域名,确认报错是否包含证书过期、日期无效。
2. 在服务器上执行:echo | openssl s_client -connect 域名:443 -servername 域名 2>/dev/null | openssl x509 -noout -dates,重点看 notAfter 是否早于当前时间。
3. 同时确认影响面:是单个域名、整站、还是 CDN、负载均衡、API 回调都受影响。不要只看首页能打开就下结论,移动端与服务端调用往往更严格。
二、定位证书到底部署在哪里
证书可能同时存在于多个位置,必须逐一核对:Nginx 或 Apache 配置里的 ssl_certificate 指向;CDN 域名证书;负载均衡 ELB 监听器证书;对象存储、API 网关等托管入口。常见坑是只换了服务器证书,却忘了 CDN 或 ELB 上还挂着旧证书。逐个域名用 openssl 检查,记录每个入口的签发机构、过期时间与证书链是否完整。
三、自动续期:让它不再过期
1. Let's Encrypt:certbot renew 后执行 nginx -t && nginx -s reload;务必检查定时任务,例如 0 3 * * * /usr/bin/certbot renew --quiet --post-hook "nginx -s reload",并确认 cron 服务在运行。
2. 云厂商证书:在 SSL 证书管理控制台设置到期提醒,续期后直接在 ELB、CDN 控制台更新证书绑定,不要只下载证书却不部署。
3. 商业证书:提前 30 天启动续费与验证流程,DV、OV、EV 的验证耗时不同,不能等到最后一天。
4. 续期后必须验证:重新执行 openssl 检查 notAfter,浏览器无痕模式访问一次,API 客户端也跑一次真实调用。
四、监控告警:提前 30 天、14 天、7 天三级提醒
只靠人工记日期一定会漏。建议:用 Prometheus 的 blackbox_exporter 采集 probe_ssl_earliest_cert_expiry,换算剩余天数并设置小于 30、14、7 天的分级告警;云监控中对证书到期时间配置告警;把告警同时发给值班群与值班人,不要只发邮件。告警文案要写清楚域名、剩余天数与负责人,避免收到告警却不知道该处理哪个域名。
五、应急替换步骤:先恢复,再完善
1. 确认故障域名与证书位置,5 分钟内完成定性。
2. 如原证书续签来不及,先申请一张免费 DV 证书顶上,保证恢复访问,正式证书到后再换回。
3. 在对应入口替换证书:Nginx 用 nginx -s reload 平滑重载,不要直接 restart 中断连接;ELB、CDN 在控制台完成证书更新。
4. 验证:openssl 检查新证书日期;浏览器、App、API 回调逐一验证;观察 10 分钟错误率与 502 比例是否回落。
5. 事后复盘:自动续期任务是否被删除、cron 是否停用、告警是否触发、是否有域名漏登记入台账。
六、常见坑清单
证书链不完整导致部分客户端报错;只换证书不重载服务;新旧证书文件路径写错;CDN 缓存了旧的错误页面;多域名共用一张证书,换错域名。建议建立域名与证书台账,字段包括域名、签发机构、过期时间、部署位置、续期方式与负责人,每月巡检一次。
结语:证书管理拼的不是技术难度,而是台账、自动续期与告警是否闭环。把这三件事做扎实,证书过期导致的中断基本可以避免。
- 点赞
- 收藏
- 关注作者
评论(0)