证书到期检查怎么做
openssl x509 提供两个直接的检查手段:-enddate 输出证书的到期时间,-checkend 以秒为单位判断证书是否会在指定时间内到期,并用退出码给出结论。把后者写进定时任务即可实现零依赖的到期巡检,既能检查本地文件,也能检查从线上服务抓取的证书。
基本信息
| -enddate | 输出 notAfter 时间(UTC) |
|---|---|
| -checkend 秒数 | 证书未在 N 秒内到期时退出码为 0,否则非 0 |
| 远端检查 | 用 s_client 抓取线上证书后交给 x509 解析 |
| 适用对象 | 本地证书文件、负载均衡节点、CDN 边缘节点 |
| 检查范围 | 只判断时间,不校验链、域名与用途 |
| 常用阈值 | 30 天(2592000 秒)作为告警线 |
典型使用场景
- 日常巡检:定时检查站点证书剩余有效期并提前告警
- 发布前检查:上线前确认新证书有效期覆盖整个业务周期
- 多节点排查:逐个节点抓取证书,找出未同步更新的实例
- CDN 与负载均衡:核对边缘节点证书与源站是否一致
- 自动化续期验证:续期完成后用同一命令确认生效
检查本地与远端证书
检查本地与远端证书
# 查看到期时间(UTC)
openssl x509 -in cert.pem -noout -enddate
# 30 天内到期则告警
openssl x509 -in cert.pem -noout -checkend 2592000 && echo OK || echo 即将到期
# 抓取线上证书并检查有效期(多站点需带 SNI)
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates
# 对线上证书做同样的阈值判断
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -checkend 604800 && echo 一周内无到期风险
# 批量巡检多个域名
echo 'example.com api.example.com' | tr ' ' '\n' | while read d; do echo -n "$d "; openssl s_client -connect $d:443 -servername $d </dev/null 2>/dev/null | openssl x509 -noout -checkend 2592000 && echo ok || echo soon; done检查项与局限
| 检查项 | 命令 | 局限 |
|---|---|---|
| 到期时间 | -enddate | 不校验链与域名 |
| 是否临期 | -checkend N | 只判断时间窗口 |
| 主体与 SAN | -subject -ext subjectAltName | 需人工比对访问域名 |
| 链完整性 | s_client -showcerts 数张数 | 不反映客户端信任库差异 |
| 实际生效证书 | s_client 抓取 | 负载均衡可能有多个后端 |
-checkend 只回答时间问题:证书没过期不等于配置正确,链不完整或域名不匹配时它依然返回 0。到期巡检应对实际对外提供服务的证书执行,并与链检查、域名检查分开列为独立巡检项。
检查对象要覆盖全链路:源站、负载均衡、CDN 边缘、API 网关与邮件服务的证书都可能各自独立。仅检查本地文件是常见的漏检来源,应从外部按域名逐个抓取核对。