CheckSSL.sh - SSL证书到期时间监控脚本

温馨提醒
总结摘要
CheckSSL.sh 是一个用于监控网站 SSL 证书到期时间的 Shell 脚本,当证书即将过期时会发送告警通知,帮助管理员及时更新证书,避免服务中断。

CheckSSL.sh - SSL 证书到期监控脚本

脚本功能

CheckSSL.sh 是一个用于批量监控多个网站 SSL 证书到期时间的 Shell 脚本。它通过 OpenSSL工具获取SSL证书的有效期信息,计算剩余有效天数,并在证书即将过期时通过 Bark推送告警通知。

核心特性

  • 批量监控多个域名的 SSL 证书
  • 自动计算证书剩余有效天数
  • 支持自定义告警阈值(默认 7 天)
  • 集成 Bark 推送告警通知
  • 支持 SNI(Server Name Indication)
  • 可灵活扩展其他告警通道(钉钉、企业微信等)

脚本依赖

系统工具依赖

  • openssl:用于获取 SSL 证书信息
  • curl:用于发送 Bark 告警请求
  • bashsh:脚本运行环境

外部服务依赖(可选)

  • Bark 服务:iOS 推送通知服务(如不需要告警可禁用)
    • 服务地址:https://api.day.app/
    • 获取 Bark Key:安装 Bark App 后自动生成

环境变量依赖

.env 文件配置

脚本需要加载同目录下的 .env文件,该文件应包含以下变量:

1
2
# Bark 通知密钥(从 Bark App 获取)
bark_key=xxxxxxxxxx

配置文件位置

  • 优先加载当前工作目录的 .env文件
  • 其次加载脚本所在目录的 .env文件

获取 Bark Key步骤

  1. 在 iOS设备 上安装 Bark App(App Store搜索"Bark")
  2. 打开 App 会自动生成一个唯一的 key
  3. 复制该 key到.env文件中

参考文档Bark 使用教程

内置变量说明

脚本内部定义的变量及其作用:

1
sites=("aliyun.com" "elisky.cn" "github.com")  # 要监控的域名列表

自定义监控站点: 取消脚本中第 18 行的注释,并修改为需要监控的域名:

1
sites=("example.com" "test.com" "api.yourdomain.com")

告警阈值配置

1
2
# 第 35 行附近,修改天数阈值
if [ $days_left -le 7 ]; then  # 改为$days_left -le 30则 30 天前告警

参数用法

本脚本无命令行参数,通过修改脚本内变量和配置文件进行定制:

  • 无参数模式:读取.env文件中的 bark_key,遍历 sites数组中的所有域名进行检查
  • 禁用告警:注释掉脚本中 Bark 相关的 curl命令(见使用方法部分)

使用方法

快速安装与使用

  1. 下载脚本

    1
    2
    3
    4
    5
    
    # 使用主下载地址
    bash <(curl -sL sc.eli1.top) CheckSSL download
    
    # 或使用备用地址
    bash <(curl -sL download.elisky.cn) CheckSSL download
  2. 创建配置文件

    1
    2
    3
    4
    5
    6
    
    # 复制模板文件
    cp .env-template .env
    
    # 编辑.env文件,填入 Bark Key
    vim .env
    # 添加:bark_key=your_bark_key_here
  3. 配置监控站点: 编辑 CheckSSL.sh脚本,修改第 18 行附近的 sites 数组:

    1
    2
    
    # 取消注释并修改为实际域名
    sites=("example.com" "api.example.com" "shop.example.com")
  4. 运行脚本

    1
    2
    3
    4
    5
    
    # 赋予执行权限
    chmod +x CheckSSL.sh
    
    # 执行脚本
    ./CheckSSL.sh

典型使用场景示例

场景 1:手动检查证书状态

1
2
3
4
5
6
# 临时检查几个域名的证书状态
# 编辑脚本,设置 sites 数组
sites=("google.com" "github.com")

# 运行脚本查看输出
./CheckSSL.sh

场景 2:定时监控任务(推荐)

1
2
3
4
5
# 添加到 crontab,每天上午 9 点执行
crontab -e

# 添加以下行
0 9 * * * /path/to/CheckSSL.sh >> /var/log/ssl_check.log 2>&1

场景 3:测试告警通道

1
2
3
4
5
# 临时修改脚本第 35 行,将阈值改为 999 天进行测试
if [ $days_left -le 999 ]; then  # 测试时会触发所有域名的告警

# 运行脚本验证 Bark 是否收到通知
./CheckSSL.sh

场景 4:禁用 Bark 告警

如果不需要 Bark 通知,可以注释掉相关代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 方法 1:注释掉.env加载部分(脚本第 6-14 行)
# if [[ -f ./.env ]]; then
#     source ./.env
# elif [[ -f $SCRIPT_DIR/.env ]]; then
#     source $SCRIPT_DIR/.env
# else
#     echo ".env file not found!..."
#     exit 1
# fi

# 方法 2:注释掉告警触发部分(脚本第 36-40 行)
# if [ $days_left -le 7 ]; then
#     curl -s https://api.day.app/$bark_key/SSL 监控告警/"$site: 证书在 $days_left 天内过期"?group=jobtest
# else
#     echo "$site: Certificate expires on $formatted_date"
# fi

场景 5:自定义告警阈值

1
2
3
# 修改脚本第 35 行,将 7 天改为 30 天
if [ $days_left -le 30 ]; then  # 提前 30 天告警
    curl -s https://api.day.app/$bark_key/SSL 监控告警/"$site: 证书将在 $days_left 天后过期"

场景 6:扩展其他告警通道

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 在脚本中添加钉钉机器人告警
if [ $days_left -le 7 ]; then
    # Bark 告警
    curl -s https://api.day.app/$bark_key/SSL 监控告警/"$site: 证书在 $days_left 天内过期"
    
    # 钉钉机器人告警
    curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
      -H 'Content-Type: application/json' \
      -d '{
        "msgtype": "text",
        "text": {
            "content": "SSL 证书告警:'"$site"' 的证书将在 '"$days_left"' 天后过期!"
        }
      }'
fi

实际应用场景

  • 多域名证书管理:企业或个人管理多个域名时,批量监控所有 SSL 证书状态
  • 自动化运维监控:集成到运维监控体系,作为 SSL 证书健康检查的一部分
  • 定时巡检任务:通过 cron定时任务实现每日/每周自动检查
  • 紧急告警通知:证书临近过期时立即推送通知,避免服务中断
  • 证书续期提醒:配合自动化续期工具(如 Let’s Encrypt),在自动续期失败时提供人工干预提醒
  • 第三方服务监控:监控依赖的第三方服务(如 API 提供商)的证书状态,提前感知潜在风险

注意事项

Bark 服务配置

  • Bark Key 保密性:不要将包含 Bark Key 的.env文件提交到代码仓库
  • 网络可达性:确保服务器能访问https://api.day.app/
  • 推送频率限制:避免过于频繁的检查触发 Bark 的频率限制

监控准确性

  • SNI 支持:脚本使用-servername参数支持 SNI,适用于虚拟主机环境
  • 端口假设:默认检查 443 端口,如果使用非标准 HTTPS 端口需要修改脚本
  • DNS 解析:确保服务器能正确解析被监控的域名

告警策略

  • 阈值设置建议

    • 7 天:适合有自动化续期流程的环境
    • 15-30 天:适合需要人工介入续期的环境
    • 90 天:Let’s Encrypt证书建议提前 90 天开始尝试续期
  • 避免告警疲劳:合理设置检查频率,建议每天检查 1 次即可

扩展与定制

  • 日志记录:建议将脚本输出重定向到日志文件便于审计

    1
    
    ./CheckSSL.sh >> /var/log/ssl_monitor.log 2>&1
  • 多重告警:可以同时配置多种告警通道(Bark + 钉钉 + 企业微信 + 邮件)

  • 错误处理:脚本缺少对网络异常的处理,建议在关键环境中增加错误重试机制

安全提示

  • 权限控制:确保.env文件的权限设置为仅所有者可读

    1
    
    chmod 600 .env
  • 定期检查:即使有自动化监控,也建议定期手动检查重要域名的证书状态

  • 备份方案:准备备用的监控方案,防止单一监控系统失效