可通过Nginx配合OpenSSL脚本定期检查SSL证书剩余有效期,输出Prometheus指标或日志告警;需解析PEM文件、计算天数、定时执行,并验证证书链与部署一致性。

可以通过 Nginx 配合外部脚本或工具,定期检查其加载的 SSL 证书剩余有效期,并将结果暴露为可监控的指标(如 Prometheus 格式)或写入日志告警。Nginx 本身不内置证书过期监控功能,但能通过合理集成实现可靠预警。
提取证书信息并计算剩余天数
SSL 证书信息存储在 PEM 文件中,无需重启 Nginx 即可读取。常用方法是用 OpenSSL 命令解析:
- openssl x509 -in /path/to/cert.pem -enddate -noout 查看证书过期时间
- openssl x509 -in /path/to/cert.pem -startdate -noout 查看生效时间(可选)
- 结合 date 和 awk 计算剩余天数,例如:
expr $(date -d "$(openssl x509 -in /etc/nginx/ssl/example.com.crt -enddate -noout | cut -d' ' -f4-)" +%s) - $(date +%s) ) / 86400
该命令输出整数天数,可用于后续判断是否低于阈值(如 30 天)。
定时检查并写入 Nginx 状态页或日志
将上述检查逻辑封装为 shell 脚本,通过 cron 定期执行:
- 脚本可将剩余天数写入一个临时文件(如 /var/run/nginx_cert_days),再由 Nginx 的 stub_status 或自定义 location 暴露
- 或直接记录到 Nginx error log,配合日志采集工具(如 Filebeat + ELK)做关键词告警
- 更推荐方式:输出为 Prometheus 格式(如 nginx_ssl_cert_remaining_days{host="example.com"} 27),存为文本文件挂载到 /var/lib/prometheus/textfile/ 下,由 node_exporter 的 textfile collector 抓取
与 Nginx 配置联动实现自动告警
不依赖外部监控系统时,也可让 Nginx 主动参与预警:
- 在脚本中加入条件判断:若剩余天数 < 15,向管理员邮箱发送通知,或调用企业微信/钉钉 Webhook
- 使用 nginx -t 验证新证书后,脚本自动 reload 并记录操作日志
- 避免在 Nginx worker 进程中实时解析证书(性能开销大、不可靠),所有检查必须在外部完成
验证证书链完整性(进阶建议)
单查域名证书不够,还需确认完整链(尤其含中间证书)未过期:
- 用 openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate 检查线上实际响应的证书
- 对比本地 PEM 与线上证书指纹(openssl x509 -in cert.pem -fingerprint -sha256 -noout),防止部署遗漏
- 对多域名证书(SAN)、通配符证书,需分别检查各域名对应的有效性,或统一按主 CN 判断
不复杂但容易忽略:证书更新后务必同步更新私钥权限(chmod 400)、验证 Nginx 配置语法、确认重载成功,再触发有效期检查脚本刷新数据。


















