定时检查证书到期并提醒脚本

wen 实用脚本 2

本文目录导读:

定时检查证书到期并提醒脚本

  1. 目录导读
  2. 为什么SSL证书到期提醒如此重要?
  3. 定时检查证书到期脚本的常见实现方式
  4. 核心脚本代码示例与详解
  5. 常见问题与解决方案(Q&A)
  6. 最佳实践与部署建议

自动化守护网站安全的黄金准则

目录导读

  1. 为什么SSL证书到期提醒如此重要?
  2. 定时检查证书到期脚本的常见实现方式
  3. 核心脚本代码示例与详解
  4. 常见问题与解决方案(Q&A)
  5. 最佳实践与部署建议

为什么SSL证书到期提醒如此重要?

在网站运营中,SSL证书的有效期已经从过去的三年缩短到目前的1年,部分证书甚至只有90天,一旦证书过期,浏览器会直接显示“不安全”警告,轻则影响用户信任,重则导致业务中断,根据Google的研究,超过80%的用户在遇到证书过期页面时会直接关闭网站。定时检查证书到期并提醒脚本成为网站管理员的必备工具。


定时检查证书到期脚本的常见实现方式

目前业界主流方案包括:

  • Shell脚本 + cron定时任务:轻量级,适用于Linux服务器,直接调用openssl命令解析证书信息。
  • Python脚本 + 邮件或WebHook通知:可扩展性强,支持钉钉、企微、Slack等通道。
  • Node.js/Go方案:适合大型集群的集中式监控。

为了平衡易用性与可靠性,本文推荐使用Shell脚本 + cron + 邮件告警的组合——无需额外依赖,几乎零成本。


核心脚本代码示例与详解

以下是一段经过优化的Shell脚本(适用于CentOS/Ubuntu),它会每天检查证书剩余天数,并发送邮件提醒:

#!/bin/bash
# 配置:要监控的域名列表
DOMAINS=("example.com" "blog. example.com" "shop. example.com")
# 配置:告警阈值(天数)
WARN_DAYS=30
EMAIL="admin@example.com"
# 配置:邮件发送命令(假设使用mailx)
MAIL_CMD="mail -s"
# 配置:钉钉机器人WebHook(可选)
DINGTALK_TOKEN="your_dingtalk_token"
# 循环检查每个域名
for DOMAIN in "${DOMAINS[@]}"; do
    # 获取证书过期时间(秒)
    EXPIRY_DATE=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
    if [ -z "$EXPIRY_DATE" ]; then
        echo "[ERROR] 无法获取 $DOMAIN 的证书信息" | $MAIL_CMD "证书检查失败 - $DOMAIN" $EMAIL
        continue
    fi
    # 转为时间戳
    EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s)
    NOW_TS=$(date +%s)
    REMAIN_DAYS=$(( ($EXPIRY_TS - $NOW_TS) / 86400 ))
    # 判断是否需要告警
    if [ $REMAIN_DAYS -le 0 ]; then
        SUBJECT="[紧急] $DOMAIN 证书已过期!"
        MESSAGE="域名 $DOMAIN 的SSL证书已于 $EXPIRY_DATE 过期,请立即更新!"
    elif [ $REMAIN_DAYS -le $WARN_DAYS ]; then
        SUBJECT="[警告] $DOMAIN 证书将在 $REMAIN_DAYS 天后过期"
        MESSAGE="域名 $DOMAIN 的SSL证书将于 $EXPIRY_DATE 到期,剩余 $REMAIN_DAYS 天,请及时续费。"
    else
        # 正常状态,跳过告警
        continue
    fi
    # 发送邮件
    echo "$MESSAGE" | $MAIL_CMD "$SUBJECT" $EMAIL
    # 可选:发送钉钉消息
    if [ -n "$DINGTALK_TOKEN" ]; then
        curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=$DINGTALK_TOKEN" \
            -H "Content-Type: application/json" \
            -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$SUBJECT\n$MESSAGE\"}}" >/dev/null 2>&1
    fi
done

使用前操作

  1. 将脚本保存为 check_ssl.sh
  2. 添加执行权限:chmod +x check_ssl.sh
  3. 设置crontab:0 8 * * * /path/to/check_ssl.sh(每天早上8点执行)。

常见问题与解决方案(Q&A)

Q1:为什么我运行脚本时提示“openssl: command not found”?
A:脚本依赖openssl工具,在Ubuntu/Debian中执行 sudo apt install openssl,在CentOS/RHEL中执行 sudo yum install openssl 即可。

Q2:我不想用邮件发送,可以换成企业微信机器人吗?
A:完全可以,只需将脚本中的$MAIL_CMD部分替换为curl调用企业微信WebHook。

curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"**$SUBJECT**\n$MESSAGE\"}}"

Q3:我有多台服务器需要统一监控,怎么办?
A:推荐两种方式:

  • 中央监控方案:在一台监控机上安装脚本,定时扫描所有目标服务器的443端口(需确保网络可达)。
  • 分布部署方案:每台服务器独立运行脚本,最终汇总告警到同一个通知通道。

Q4:脚本每天执行一次,如果当天证书过期但检查间隔内失效怎么办?
A:建议将crontab调整为每6小时或每4小时检查一次,更保险的做法是部署“主动监测+被动回调”组合,例如配合第三方监控平台(如UptimeRobot)的证书到期告警API。


最佳实践与部署建议

要让定时检查证书到期并提醒脚本真正发挥“安全守门员”作用,请遵循以下原则:

  1. 分级告警策略:设置30天、14天、7天、3天、1天多个阈值,避免一次性惊动。

    • 30天:邮件提醒管理员。
    • 14天:邮件+钉钉群消息。
    • 7天:电话告警(通过API调用腾讯云或阿里云的电话通知服务)。
  2. 避免“告警疲劳”:对同一个域名不要发送重复状态的提示,可以在脚本中加入状态缓存文件,仅当剩余天数跨越阈值时才触发通知。

  3. 兼容不同证书类型:通配符证书(*.example.com)和多域名证书(SAN证书)同样适用以上脚本,只需将每个具体域名加入DOMAINS数组即可。

  4. 日志记录:在脚本头部增加日志输出,

    LOG_FILE="/var/log/ssl_check.log"
    echo "[$(date)] Checking $DOMAIN: $REMAIN_DAYS days left" >> $LOG_FILE

    方便事后溯源。

  5. 考虑使用HashiCorp Vault或KMS:对于大型企业,可以将证书私钥和提醒逻辑统一管理在Secret Store中,避免脚本直接硬编码敏感信息。


通过以上综合搜索引擎现有资料提炼的方案,您可以在极低成本下构建一套可靠的证书到期自动提醒体系。证书过期不是技术问题,而是管理问题——一个好的定时检查脚本,就是那个永远不会忘记的“数字闹钟”。

抱歉,评论功能暂时关闭!