SSL证书的过期监控与告警,其实并不依赖Nginx自带的功能,而是通过外部脚本定期检查本地PEM文件或远程443端口的证书有效期,计算剩余天数,低于阈值时触发企业微信等通知,并借助cron定时执行、状态文件防重复告警、日志记录与权限配置实现自动化落地。

SSL 证书过期监控与告警,本质上并不依赖 Nginx 自身的内置功能,而是通过外部脚本定期“体检”证书有效期,并依据预设阈值触发通知。这套机制的核心逻辑其实很直接:查得准、判得清、发得及时,三步走就能稳稳落地。
一、怎么准确获取剩余天数
有两种主流方式,选哪种取决于你的部署场景:
- 本地文件检查:适用于证书由运维统一管理、路径固定(如
/etc/nginx/ssl/example.com.pem)。命令示例:openssl x509 -in /etc/nginx/ssl/example.com.pem -enddate -noout | awk -F' = ' '{print $2}' | xargs -I{} date -d "{}" +%s 2>/dev/null | xargs -I{} echo $(( ({} - $(date +%s)) / 86400 ))
返回正整数即剩余天数,负数表示已过期。 - 远程端口检查:更贴近真实访问链路,尤其适合用了 CDN、负载均衡或自动续签的环境。命令示例:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -enddate -noout | awk -F' = ' '{print $2}' | xargs -I{} date -d "{}" +%s 2>/dev/null | xargs -I{} echo $(( ({} - $(date +%s)) / 86400 ))
这样能抓到线上实际生效的证书,避免本地文件未同步导致误判。
二、怎么避免重复告警和漏报
光检测不够,得加逻辑控制:
- 设好告警阈值,比如 15 天初告、7 天加急、0 天强制处理;
- 用状态文件记录(如
/tmp/ssl_alerted_example.com),同一域名只在首次低于阈值时告警; - 脚本里加错误捕获,比如证书损坏、网络超时、OpenSSL 命令失败时跳过该域名,不中断整个检查流程;
- 支持批量域名,把所有要监控的域名、证书路径或目标地址写进一个 CSV 或文本列表,脚本循环读取执行。
三、怎么把告警发出去
企业微信最常用,也最容易落地:
- 在企业微信后台创建群机器人,获取 Webhook 地址;
- 脚本中用
curl -X POST发送 Markdown 格式 JSON,内容包含域名、剩余天数、过期时间; - 示例消息体:
{"msgtype": "markdown", "markdown": {"content": "⚠️ SSL 证书告警n> 域名:example.comn> 剩余有效期:8 天n> 过期时间:2026-08-06"}} - 别忘了加日志记录,比如写入
/var/log/ssl_check.log,方便回溯哪天哪个证书触发了什么动作。
四、怎么让检查自动跑起来
靠系统级定时任务,简单可靠:
- 把脚本保存为
/opt/scripts/check_ssl.sh,加上执行权限:chmod +x /opt/scripts/check_ssl.sh; - 编辑 crontab:
0 2 * * * /bin/bash /opt/scripts/check_ssl.sh >> /var/log/ssl_check_cron.log 2>&1,每天凌晨 2 点执行; - 确认运行用户(如
www-data或root)有读取证书文件的权限——证书通常是600权限,建议把用户加入对应组,而不是直接chmod 644。
