如何监控 Let's Encrypt 证书续签状态并发送钉钉通知?

文章导读
监控 Let's Encrypt 证书续签状态最稳妥的方式是通过定时任务检查证书过期时间,并在剩余天数低于阈值时调用钉钉自定义机器人 Webhook 发送告警。适用场景为所有使用 ACME 协议自动续签的 Linux 服务器,风险边界在于需确保服务器 outbound 网络能访问钉钉 API 接口。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

监控 Let's Encrypt 证书续签状态最稳妥的方式是通过定时任务检查证书过期时间,并在剩余天数低于阈值时调用钉钉自定义机器人 Webhook 发送告警。适用场景为所有使用 ACME 协议自动续签的 Linux 服务器,风险边界在于需确保服务器 outbound 网络能访问钉钉 API 接口。

先说结论:通过 Shell 脚本结合 Cron 定时任务读取证书有效期,触发钉钉机器人 Webhook 是实现监控的标准方案。

  • 适合:使用 Certbot 或 ACME.sh 管理证书的 Linux 环境
  • 先准备:钉钉群自定义机器人 Webhook 地址及 Secret
  • 建议:设置剩余 30 天阈值告警,避免续签失败导致服务中断

命令速用版

#!/bin/bash
CERT_PATH="/etc/letsencrypt/live/yourdomain/fullchain.pem"
EXPIRE_DATE=$(openssl x509 -in $CERT_PATH -noout -enddate | cut -d= -f2)
EXPIRE_TIMESTAMP=$(date -d "$EXPIRE_DATE" +%s)
NOW_TIMESTAMP=$(date +%s)
DAYS_LEFT=$(( (EXPIRE_TIMESTAMP - NOW_TIMESTAMP) / 86400 ))
if [ $DAYS_LEFT -lt 30 ]; then
  curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"msgtype":"text","text":{"content":"证书即将过期,剩余天数:'$DAYS_LEFT'"}}'
fi

为什么会这样

Let's Encrypt 证书有效期固定为 90 天,客户端通常会在到期前 30 天尝试自动续签。

自动续签可能因网络波动、速率限制或配置变更而失败,若无人工监控,证书过期会导致 HTTPS 服务不可用。钉钉通知能将被动排查转为主动告警,确保管理员在证书失效前介入处理。

分步处理

第一步:创建钉钉机器人

在钉钉群设置中添加自定义机器人,获取 Webhook 地址。若开启签名安全设置,需记录 Secret 用于生成签名。

如何监控 Let's Encrypt 证书续签状态并发送钉钉通知?

第二步:编写检查脚本

将上述命令速用版代码保存为 `/usr/local/bin/check_cert.sh`。若钉钉机器人开启了签名验证,需在 URL 中拼接 timestamp 和 sign 参数,使用 HMAC-SHA256 算法生成签名。

第三步:配置定时任务

执行 `crontab -e`,添加每日检查任务:`0 10 * * * /bin/bash /usr/local/bin/check_cert.sh`。确保脚本具有执行权限 `chmod +x /usr/local/bin/check_cert.sh`。

怎么验证是否生效

手动修改脚本中的阈值判断条件,例如将 `-lt 30` 改为 `-lt 365`,强制触发告警逻辑。

如何监控 Let's Encrypt 证书续签状态并发送钉钉通知?

执行脚本后检查钉钉群是否收到消息,同时查看系统日志 `/var/log/cron` 确认定时任务是否正常调度。

恢复阈值设置后,确保证书正常状态下不再频繁发送通知。

常见坑

签名验证失败:钉钉机器人若开启签名安全,URL 必须携带正确的 timestamp 和 sign 参数,否则请求会被拦截。

时区不一致:服务器系统时间若未同步,会导致计算的剩余天数不准确,建议配置 NTP 服务。

如何监控 Let's Encrypt 证书续签状态并发送钉钉通知?

证书路径错误:不同 ACME 客户端证书存储路径不同,Certbot 默认在 `/etc/letsencrypt/live/`,需根据实际路径修改脚本。

网络防火墙:服务器需能访问 `oapi.dingtalk.com`,若处于内网环境需配置出站代理或白名单。

常见问题

Let's Encrypt 证书多久过期?

证书有效期固定为 90 天,到期后必须续签才能继续使用。

钉钉机器人 Webhook 安全吗?

建议开启签名安全设置,防止 Webhook 地址泄露后被恶意调用发送垃圾消息。

续签失败会自动重试吗?

Certbot 默认每天运行两次定时任务,但连续失败可能触发速率限制,需人工干预。

参考来源

  • Let's Encrypt Official Documentation - Certificate Lifetime
  • DingTalk Open Platform - Custom Robot Access