Apache不自带证书过期监控,需通过脚本定期检查本地证书文件或线上HTTPS端口,计算剩余天数并分级告警,集成企业微信/邮件通知、Prometheus指标及cron定时执行。

Apache 本身不提供证书过期监控和告警功能,必须通过外部机制实现。核心思路是:定期检查证书有效期 → 判断剩余天数是否低于阈值 → 触发通知。不依赖 Apache 模块,而是用轻量、可靠、可落地的方式完成闭环。
直接检测本地证书文件(适合自托管环境)
如果你的证书明确存放在服务器上(如 /etc/ssl/certs/example.com.crt 和 /etc/ssl/private/example.com.key),最稳定的方式是解析证书文件本身:
- 用 openssl x509 -in /path/to/cert.crt -noout -enddate 提取过期时间字符串
- 转成时间戳后与当前时间比较,算出剩余天数(date -d "Jul 15 23:59:59 2027 GMT" +%s 是关键转换步骤)
- 脚本中设置两级预警:≤30 天发普通提醒,≤7 天触发紧急通知(含域名、过期时间、服务器 IP)
- 注意跳过 PEM 中的私钥段,只处理第一个有效证书;支持 .crt、.pem、.fullchain.pem 等常见格式
探测线上 HTTPS 端口(更贴近真实访问体验)
尤其适用于使用 CDN、负载均衡或自动续签(如 Certbot + cron)的场景,能发现“文件已更新但服务未重载”或“证书链缺失”等线上实际问题:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 执行 echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
- 该命令模拟浏览器握手,获取服务端实时返回的证书,结果比读文件更具业务真实性
- 批量检测时建议加超时控制(如 timeout 10s),避免单个域名阻塞整个脚本
- 失败情况(连接拒绝、证书不可信、SNI 不匹配)需记录日志但不中断流程,便于后续人工介入
集成通知渠道并防骚扰
告警不是越多越好,关键是让信息准确触达且可操作:
- 企业微信/钉钉:用 curl -X POST 推送 JSON 消息,包含域名、剩余天数、过期时间、证书指纹(SHA-256),方便快速定位
- 邮件通知:标题加【SSL 过期预警】前缀,正文中列出所有临期证书汇总,避免每台服务器单独发一封
- 加状态锁机制:例如用 /tmp/ssl_alerted_example.com 文件记录上次告警时间,72 小时内不重复推送同一域名
- 把剩余天数作为指标暴露给 Prometheus(如用 ssl_cert_not_after_seconds),配合 Alertmanager 设置 14d/7d 告警规则
定时运行与日常维护要点
脚本写好只是第一步,真正起作用的是稳定执行和持续验证:
- 加入 cron:每天上午 9 点执行(0 9 * * * /opt/ssl-check/check-apache-certs.sh >> /var/log/ssl-check.log 2>&1)
- 每次运行后检查退出码,非零值应写入监控系统(如 Zabbix 自定义键值或 Prometheus pushgateway)
- 每月人工抽检一次:运行脚本后对比输出与 openssl x509 -in ... -text -noout | grep "Not After" 手动结果是否一致
- 保留最近 30 天日志,当某域名突然从“32 天”跳到“-2 天”,说明证书已过期或配置被覆盖,需立即排查

















