nginx 本身不支持 ssl 证书过期监控,需通过 shell/python 脚本定期检查证书剩余有效期,并调用企业微信机器人 api 发送告警;脚本读取 ssl_certificate 指定路径的证书文件,用 openssl x509 -checkend 判断是否在指定天数内过期,结合 webhook 发送含域名、过期时间、剩余天数等信息的告警,并通过临时文件防重复告警,最后由 cron 定时执行。

在 Nginx 环境中,Nginx 本身不直接提供 SSL 证书过期监控能力,但可通过外部脚本(如 Shell 或 Python)定期检查证书剩余有效期,并在临近过期时调用企业微信机器人 API 发送告警。关键在于:把证书检查逻辑与告警通道打通,再用系统定时任务驱动执行。
获取并解析 SSL 证书有效期
证书通常部署在 Nginx 配置中指定的 ssl_certificate 路径下(如 /etc/nginx/ssl/example.com.pem)。脚本需读取该文件,提取到期时间:
- 使用
openssl x509 -in /path/to/cert.pem -enddate -noout获取原始到期时间字符串(如notAfter=Jan 15 12:34:56 2026 GMT) - 用
date -d或openssl x509 -in ... -checkend N(N 单位为秒)快速判断是否将在 N 秒内过期,更简洁可靠 - 若证书是链式文件(含中间证书),
openssl默认只读取第一个证书;确保目标证书在文件开头,或用head -n 100 cert.pem | openssl x509 ...精准提取
配置企业微信机器人 Webhook 告警
在企业微信管理后台创建「群机器人」,获取 webhook 地址(形如 https://qyapi.weixin.qq.com/...&key=xxx)。脚本需构造 JSON 请求发送告警:
- 使用
curl -X POST提交包含msgtype: "text"和text.content的 JSON 数据 - 内容建议包含域名、证书路径、剩余天数、过期时间、紧急程度(如“⚠️ SSL 证书7天后过期”)
- 可添加
at_mobile_list字段 @ 指定手机号,或at_all: true全员提醒(注意群设置是否允许)
编写可复用的监控脚本(Shell 示例)
以下是一个轻量、带日志和防重复告警的 Shell 脚本框架:
- 定义变量:
CERT_PATH="/etc/nginx/ssl/example.com.pem"、WEBHOOK_URL="https://qyapi.weixin.qq.com/..."、ALERT_DAYS=7 - 用
openssl x509 -in $CERT_PATH -checkend $((ALERT_DAYS * 86400))返回 0 表示即将过期,非 0 表示安全 - 检查通过后,记录最近一次告警时间到临时文件(如
/tmp/ssl_alert_last.txt),避免每天重复刷屏 - 告警前校验该文件是否存在且距今
通过 crontab 定期执行并验证效果
将脚本加入系统定时任务,推荐每天凌晨执行一次:
- 编辑 root crontab:
sudo crontab -e - 添加行:
0 3 * * * /bin/bash /opt/scripts/check-ssl-expire.sh >> /var/log/ssl-check.log 2>&1(每天 3 点执行) - 首次运行前手动执行脚本测试输出和告警是否正常;检查日志确认无权限错误(如读取证书文件、curl 网络访问)
- 可在脚本开头加
set -e确保任一命令失败即终止,便于定位问题
不复杂但容易忽略的是证书路径权限和 curl 的 HTTPS 依赖——确保运行脚本的用户有读取证书权限,且系统已安装 ca-certificates 包以支持可信 HTTPS 请求。











