直接监控证书剩余天数并预警,通过本地PEM文件或远程443端口实时提取有效期,结合脚本+定时任务+多级通知实现闭环,强调取值准确、判断及时、告警克制。

直接监控证书剩余天数并预警,不依赖 Nginx 或其他服务的内置能力,而是从证书本身或线上端口实时提取信息,再通过脚本+定时任务+通知链路完成闭环。核心在于“取值准确、判断及时、告警克制”。
从哪获取证书有效期
两种主流方式,按实际部署选其一或并用:
-
本地 PEM 文件检查:适合证书由运维统一管理、路径固定(如
/etc/nginx/ssl/example.com.pem),命令简洁稳定:openssl x509 -in /path/to/cert.pem -noout -enddate | awk -F' = ' '{print $2}' | xargs -I{} date -d "{}" +%s 2>/dev/null | xargs -I{} echo $(( ({} - $(date +%s)) / 86400 )) -
远程 443 端口检查:更真实反映线上实际证书(尤其用了 CDN、LB、自动续签等情况),命令示例:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | awk -F' = ' '{print $2}' | xargs -I{} date -d "{}" +%s 2>/dev/null | xargs -I{} echo $(( ({} - $(date +%s)) / 86400 ))
注意:返回负数表示已过期,0 表示当天到期,正数即为剩余天数。
设置合理预警阈值与防重复机制
只设一个阈值容易误报或漏报,建议分层设定:
- 提前 30 天:发低优先级提醒(如企业微信静默消息),用于启动续签准备
- 提前 7 天:发中优先级提醒(如邮件+加粗标题),要求确认续签进度
- 提前 3 天或已过期:发高优先级告警(如电话+钉钉强提醒),触发应急流程
- 每次告警后写入状态文件(如
/tmp/ssl_alerted_example.com),记录时间戳;下次检测前比对,避免同一天重复推送
集成到监控系统实现自动化
根据团队技术栈选择落地方式:
- 轻量级方案:Shell 脚本 + cron + 邮件/企业微信 CLI 工具。每天凌晨执行,失败时调用通知命令
-
Zabbix 方案:将检查脚本封装为自定义 key(如
ssl.cert.daysleft[example.com,443]),在 Zabbix 中配置触发器,支持图形化展示趋势 -
Prometheus 方案:用 Exporter(如
ssl_exporter)暴露指标ssl_cert_not_after_seconds,配合 Alertmanager 设置基于剩余秒数的告警规则 - 专用工具方案:ALLinSSL、CertMagic 内置监控接口或 Webhook 回调,可批量导入域名、设置多通道通知、控制重复间隔
验证与日常维护要点
光部署不够,还需持续校验有效性:
- 每次证书更新后,手动运行一次检查脚本,确认输出与实际一致
- 定期(如每月)抽查 3–5 个域名,对比本地文件 vs 远程端口结果是否一致,排查 CDN 缓存或中间设备干扰
- 在监控系统中保留至少 90 天的历史数据,观察续签是否规律(例如 Let’s Encrypt 通常在到期前 30 天左右自动更新)
- 把证书域名列表纳入配置管理(如 Git 仓库),变更时自动触发监控任务重建










