核心思路是用 OpenSSL 提取证书 Not After 时间并转为 Unix 时间戳与当前时间比较,支持本地 PEM 文件或远程域名获取证书,剩余≤7天或已过期时触发告警,可对接钉钉机器人(需加签)或企业微信应用(需获取 access_token),通过 crontab 每日定时执行并记录日志。

获取证书过期时间并判断是否临近失效
核心思路是用 OpenSSL 提取证书的 Not After 时间,转为 Unix 时间戳后与当前时间比较。通常建议提前 7 天、3 天和当天告警。可写成一个 Shell 脚本,例如 check_cert.sh:
- 支持从本地 PEM 文件或远程域名(通过
openssl s_client)获取证书 - 用
openssl x509 -in cert.pem -enddate -noout提取过期时间 - 用
date -d "..." +%s转为时间戳,计算剩余天数 - 若剩余 ≤ 7 天且 > 0,触发告警;若 ≤ 0,说明已过期,也需告警
对接钉钉机器人发送告警消息
在钉钉群中添加自定义机器人,开启「加签」或「IP 白名单」(推荐加签更安全),获取 Webhook URL 和密钥。脚本中用 curl 发送 JSON 消息:
支持AI生成符合公众号规范的图文,推送至草稿箱;兼容其他技能生成的图文/图片。通过向导扫码授权,支持多账号;无需暴露Secret密钥或配置IP白名单。
- 构造含
msgtype: "text"或"markdown"的请求体 - 若启用加签,需按钉钉文档拼接 timestamp + 密钥生成签名,并追加到 URL 后
- 示例关键字段:
{"msgtype": "text", "text": {"content": "⚠️ 域名 example.com 的 SSL 证书将在 2 天后过期!"}} - 建议加入
at_mobiles字段(如["13800138000"])实现 @相关人员
对接企业微信应用发送告警消息
在企业微信管理后台创建「自建应用」,获取 CorpID、Secret 和 AgentID。脚本需分两步调用:
- 先用
curl向https://qyapi.weixin.qq.com/cgi-bin/gettoken获取 access_token - 再用该 token 调用
https://qyapi.weixin.qq.com/cgi-bin/message/send推送文本或卡片消息 - 支持指定
toparty(部门 ID)或touser(成员 ID),也可设safe=0允许非加密消息 - 为提升可读性,推荐使用
msgtype: "textcard",带标题、描述和跳转链接
集成到 Nginx 环境并定时执行
Nginx 本身不执行脚本,告警逻辑应由系统级定时任务驱动。常见做法是:
- 将检查脚本放在
/opt/nginx-cert-alert/等固定路径,确保权限为755,属主可读写 - 用
crontab -e添加每日凌晨 2 点执行:0 2 * * * /opt/nginx-cert-alert/check_cert.sh >> /var/log/cert_alert.log 2>&1 - 脚本内需明确指定证书路径(如
/etc/nginx/ssl/example.com/fullchain.pem)或域名列表 - 避免重复告警:可在脚本中记录上次告警时间或状态到临时文件,相同状态 24 小时内不再发送


















