可通过外部脚本结合 OpenSSL 和 cron 实现 SSL 证书过期自动预警:提取证书到期时间、计算剩余天数、低于阈值时邮件通知,并支持多域名检查与日志记录。

可以通过定期检查证书剩余有效期并触发邮件通知来实现 SSL 证书过期前的自动预警,Nginx 本身不提供该功能,需借助外部脚本和系统定时任务配合完成。
获取证书剩余天数
SSL 证书信息通常存于 PEM 文件中(如 /etc/nginx/ssl/example.com.crt),可用 OpenSSL 命令提取到期时间:
- openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -enddate 查看证书过期时间
- openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -dates 同时显示生效与过期时间
- 用 date -d "$(openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -enddate | cut -d'=' -f2-)" +%s 转为 Unix 时间戳,便于计算剩余天数
编写预警检查脚本
创建一个 Shell 脚本(如 /usr/local/bin/check-ssl-expiry.sh),核心逻辑是:读取证书、计算剩余天数、低于阈值则发邮件:
- 设定预警阈值(如 30 天、15 天、7 天),支持多级提醒
- 使用 mail 或 sendmail 命令发送邮件(需系统已配置 SMTP)
- 示例命令:echo "证书将于 X 天后过期" | mail -s "SSL 证书即将过期" admin@example.com
- 建议加入日志记录(如 logger "SSL warning: example.com expires in $days_left days")便于排查
配置定时任务执行检查
用 cron 每日运行脚本,确保及时发现临近过期的证书:
- 编辑 root 的 crontab:sudo crontab -e
- 添加一行:0 3 * * * /usr/local/bin/check-ssl-expiry.sh >/dev/null 2>&1(每天凌晨 3 点执行)
- 确保脚本有执行权限:chmod +x /usr/local/bin/check-ssl-expiry.sh
- 若证书由 Let's Encrypt 自动续签(如 certbot),可将检查逻辑集成到续签后的 deploy-hook 中,避免重复告警
增强可靠性的小技巧
避免因单点故障导致漏报,可进一步提升健壮性:
- 脚本开头检查证书文件是否存在且可读,防止路径错误导致静默失败
- 对多个域名证书循环检查,统一管理(如遍历 /etc/nginx/ssl/*.crt)
- 邮件内容包含证书路径、域名、确切过期日期,方便快速定位
- 可选:对接企业微信/钉钉机器人,实现多通道通知
整个方案不依赖 Nginx 模块或重载配置,轻量可靠,运维成本低。


















