可通过脚本+定时任务监控Nginx托管域名SSL证书有效期并自动报警:支持本地PEM文件解析和远程443端口证书检查,剩余天数低于阈值时触发Slack/邮件等通知,亦可对接Prometheus+Alertmanager实现可观测性。

可以通过定期检查 SSL 证书剩余有效期,并结合脚本+定时任务+Nginx 日志或上游服务暴露的指标,实现对 Nginx 托管域名 SSL 证书过期时间的监控与自动报警。核心思路是:不依赖 Nginx 原生功能(它本身不提供证书过期监控),而是从证书文件或远程端口实时提取信息,判断有效期,再触发通知。
获取证书有效期的常用方式
SSL 证书通常以 PEM 格式存放(如 /etc/nginx/ssl/example.com.pem),或由 Let's Encrypt 等工具自动更新。监控前需确认证书来源:
- 若使用本地 PEM 文件:直接读取证书内容解析有效期
- 若 Nginx 反向代理后端 HTTPS 服务(如 API):需对 upstream 的 443 端口做远程证书检查
- 若用 certbot 自动续签:可复用其 hooks 或检查 renewal 目录下的 latest 证书链
编写证书过期检查脚本(Shell 示例)
以下是一个轻量级 Bash 脚本,支持本地文件和远程域名两种模式,输出剩余天数并返回非零状态码当小于阈值(如 7 天):
#!/bin/bash
DOMAIN="example.com"
THRESHOLD=7
CERT_FILE="/etc/nginx/ssl/${DOMAIN}.pem"
<h1>方式1:检查本地证书文件</h1><p>if [[ -f "$CERT_FILE" ]]; then
EXPIRE_DATE=$(openssl x509 -in "$CERT_FILE" -noout -enddate 2>/dev/null | cut -d' ' -f4-)
DAYS_LEFT=$(( ($(date -d "$EXPIRE_DATE" +%s) - $(date +%s)) / 86400 ))</p><h1>方式2:检查远程服务器证书(跳过证书验证,仅取服务端发来的证书)</h1><p>else
EXPIRE_DATE=$(echo | openssl s_client -connect "${DOMAIN}:443" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d' ' -f4-)
DAYS_LEFT=$(( ($(date -d "$EXPIRE_DATE" +%s) - $(date +%s)) / 86400 ))
fi</p><p>if [[ "$DAYS_LEFT" -lt "$THRESHOLD" ]]; then
echo "⚠️ SSL certificate for $DOMAIN expires in $DAYS_LEFT days!"
exit 1
else
echo "✅ OK: $DAYS_LEFT days remaining"
exit 0
fi
</p>
集成到定时任务并触发报警
将脚本加入 cron,每天执行一次,并在失败时调用通知命令:
- 保存脚本为 /usr/local/bin/check-ssl-expiry.sh,添加可执行权限:chmod +x
- 编辑 root crontab:sudo crontab -e
- 添加一行(每天上午 9 点检查):
0 9 * * * /usr/local/bin/check-ssl-expiry.sh || curl -X POST https://hooks.slack.com/services/xxx/yyy/zzz --data '{"text":"SSL cert for example.com expires soon!"}' - 也可替换为邮件:|| echo "Cert expiring" | mail -s "SSL Alert" admin@example.com
进阶:对接 Prometheus + Alertmanager(适合容器化或云环境)
若已有 Prometheus 生态,可用 blackbox_exporter 的 https 模块采集证书过期时间指标:
- 配置 blackbox_exporter 的
prober: https,启用tls_config.insecure_skip_verify: true(仅内网可信环境) - 在 Prometheus 中写 rule:
ssl_cert_not_after{job="blackbox", instance="example.com:443"} - time() (7 天) - Alertmanager 配置邮件、Webhook 或企业微信通知模板
不需要改 Nginx 配置,关键在于把证书生命周期纳入可观测性体系。脚本轻量、可扩展,配合已有运维通道就能快速落地。











