ssl证书到期监控需建立独立于服务的自动化检查机制,通过定期读取本地或远程证书、计算剩余天数、按阈值多通道告警,并用cron定时执行、权限控制与日志记录保障可靠性。

SSL 证书到期前的自动监控与告警提醒,关键不是“配置证书”,而是建立一套独立于证书本身的检查机制——它不依赖 Nginx 或其他服务的内置功能,而是通过定期读取证书信息、计算剩余天数、触发通知来实现。核心是自动化+阈值判断+多通道触达。
一、确认监控对象:本地文件 or 远程端口
先明确你要监控的是哪类证书:
-
本地 PEM 文件:适用于 Let's Encrypt 自动续签后存放在
/etc/letsencrypt/live/域名/fullchain.pem或宝塔的/www/wwwroot/域名/fullchain.pem等路径。这种方式最稳定,适合证书由你统一管理的场景。 -
远程 HTTPS 端口:执行
openssl s_client -connect example.com:443 -servername example.com抓取线上实际响应的证书。更真实,尤其适用于用了 CDN、四层 LB、或证书部署在非 Nginx 设备(如 WAF)的情况。
两者可并存:脚本中优先尝试远程检测(反映真实状态),失败再 fallback 到本地文件。
二、用 Shell 脚本提取剩余天数并判断阈值
一行命令就能算出剩余天数,但要写成健壮脚本,需处理异常和边界情况:
- 用
openssl x509 -in xxx.pem -enddate -noout提取过期时间字符串; - 用
date -d "Aug 12 23:59:59 2026 GMT" +%s转成时间戳; - 与当前时间戳相减,除以 86400 取整,得到剩余天数(负数表示已过期);
- 设定多级阈值:比如 ≤30 天发邮件提醒负责人,≤7 天发企业微信到运维群,≤3 天电话通知值班人。
脚本里建议加入防重复告警逻辑,例如用 /tmp/ssl_alerted_example.com 状态文件记录上次告警时间,避免每天刷屏。
三、对接告警通道:选一个最快能用的
不用追求大而全,先确保能收到通知:
-
企业微信/钉钉机器人:最常用。拿到 Webhook 地址后,用
curl -X POST发送 Markdown 消息,含域名、剩余天数、过期日期、跳转链接; - 宝塔内置邮件提醒:在【网站→SSL→证书管理】里勾选“到期邮件提醒”,配合面板 SMTP 设置(如 QQ 邮箱需填授权码),7 天前自动发邮件;
-
本地 mail 命令:适合已有邮件服务器的环境,一条
echo "告警" | mail -s "SSL 过期" admin@example.com即可。
注意:告警消息里务必包含具体域名和精确到期时间,避免模糊表述如“某证书即将过期”。
四、定时执行与权限保障
监控失效往往不是逻辑问题,而是执行没起来:
- 用
crontab -e添加任务,例如每天凌晨 2 点运行:0 2 * * * /bin/bash /opt/scripts/check-ssl.sh >> /var/log/ssl_check.log 2>&1 - 确保执行用户(如
root或www-data)有读取证书文件的权限。若证书权限是600,不要直接chmod 644,应把用户加入证书所在组(如certs),再赋组读权限; - 日志必须保留:每次检查结果、是否触发告警、错误原因(如证书文件不存在、OpenSSL 解析失败)都要写入日志,便于回溯。











