ssh域名过期,消息推送到企业微信

1.shell脚本

bash 复制代码
#!/bin/bash

# ================= 配置区域 =================
# 企业微信机器人 webhook key
WEBHOOK_KEY="xxxxxx"

# 检测的域名列表(一行一个)
DOMAINS=(
    "vip.xxx.com:443"
    "oa.xxxx.com:443"
)

# 提前多少天提醒(默认30天)
WARN_DAYS=30

# 临时文件(用于存储结果)
TEMP_FILE="/tmp/ssl_check_result_$(date +%s).md"

# ================= 函数:获取证书过期时间 =================
get_cert_expiry() {
    local domain=$1
    local port=${2:-443}
    
    # 使用 openssl 获取证书信息
    expiry_date=$(echo | openssl s_client -servername "$domain" -connect "$domain:$port" 2>/dev/null | \
                  openssl x509 -noout -enddate 2>/dev/null | \
                  cut -d= -f2)

    if [ -z "$expiry_date" ]; then
        echo "ERROR: 无法获取证书信息"
        return 1
    fi

    # 转换为时间戳
    expiry_timestamp=$(date -d "$expiry_date" +%s 2>/dev/null)
    if [ $? -ne 0 ]; then
        echo "ERROR: 日期解析失败: $expiry_date"
        return 1
    fi

    echo $expiry_timestamp
}

# ================= 函数:发送企业微信消息 =================
send_wechat_msg() {
    local content="$1"
    
    curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$WEBHOOK_KEY" \
         -H "Content-Type: application/json" \
         -d "{
               \"msgtype\": \"markdown\",
               \"markdown\": {
                   \"content\": \"$content\"
               }
           }"
}

# ================= 主程序 =================
echo "# 📅 SSL 证书到期检测报告 $(date +'%Y-%m-%d %H:%M')" > "$TEMP_FILE"
echo "" >> "$TEMP_FILE"
echo "## 检测域名列表:" >> "$TEMP_FILE"
echo "" >> "$TEMP_FILE"

WARN_FLAG=0

for item in "${DOMAINS[@]}"; do
    IFS=':' read -r domain port <<< "$item"
    port=${port:-443}

    echo "- \`$domain:$port\`" >> "$TEMP_FILE"

    expiry_ts=$(get_cert_expiry "$domain" "$port")
    if [[ $? -ne 0 ]] || [[ -z "$expiry_ts" ]]; then
        echo "  - ❌ 获取证书失败" >> "$TEMP_FILE"
        WARN_FLAG=1
        continue
    fi

    now_ts=$(date +%s)
    remain_days=$(( (expiry_ts - now_ts) / 86400 ))

    if [ $remain_days -le $WARN_DAYS ] && [ $remain_days -ge 0 ]; then
        echo "  - ⚠️ **即将过期:剩余 $remain_days 天**" >> "$TEMP_FILE"
        WARN_FLAG=1
    elif [ $remain_days -lt 0 ]; then
        echo "  - ❗ **已过期:$(( -remain_days )) 天前**" >> "$TEMP_FILE"
        WARN_FLAG=1
    else
        echo "  - ✅ 正常:剩余 $remain_days 天" >> "$TEMP_FILE"
    fi
done

echo "" >> "$TEMP_FILE"
if [ $WARN_FLAG -eq 1 ]; then
    echo "> 💡 **请尽快处理即将过期或已过期的证书!**" >> "$TEMP_FILE"
else
    echo "> ✅ 所有证书均在安全期内。" >> "$TEMP_FILE"
fi

# 读取内容并转义换行符和引号,适配 JSON
CONTENT=$(sed ':a;N;$!ba;s/\n/\\n/g;s/"/\\"/g' "$TEMP_FILE")

# 发送消息
send_wechat_msg "$CONTENT"

# 清理临时文件
rm -f "$TEMP_FILE"

2.赋予脚本执行权限

复制代码
chmod +x check_ssl_cert.sh

3.配置定时任务(crontab)

bash 复制代码
crontab -e

# 每天早上10执行
0 10 * * * /bin/bash /home/check_ssl_cert.sh

4.测试运行

手动运行一次测试:

bash 复制代码
./check_ssl_cert.sh

5.结果

bash 复制代码
📅 SSL 证书到期检测报告 2025-09-10 10:00

## 检测域名列表:

- `example.com:443`
  - ⚠️ **即将过期:剩余 25 天**
- `google.com:443`
  - ✅ 正常:剩余 89 天
- `github.com:443`
  - ✅ 正常:剩余 365 天

> 💡 **请尽快处理即将过期或已过期的证书!**

6.注意事项

  1. 确保服务器能访问外网和目标域名的 443 端口

  2. 确保安装了 opensslcurl

    复制代码
    # Ubuntu/Debian
    sudo apt update && sudo apt install openssl curl -y
    
    # CentOS/RHEL
    sudo yum install openssl curl -y
  3. 企业微信机器人 Webhook Key 需要保密,不要提交到 Git

  4. 如需支持中文域名或 SNI,脚本已内置 -servername 参数支持

7.可选增强功能

  • ✅ 添加日志记录到文件
  • ✅ 支持从文件读取域名列表
  • ✅ 支持钉钉、飞书等多平台推送
  • ✅ 支持证书颁发者、签发时间等详细信息
相关推荐
有谁看见我的剑了?19 小时前
Rocky 9 单机安装elastic-9.1.5
运维·elk
Gss77719 小时前
ELK 日志管理系统相关内容总结
运维·elk
半梦半醒*19 小时前
ELK1——elasticsearch
linux·运维·数据仓库·elasticsearch·centos
程序员辉哥20 小时前
在Cursor中通过SSH MCP运维自己的服务器
ssh·cursor·mcp
妹妹够啦20 小时前
宝塔部署-Nginx配置
运维·nginx·junit
love530love20 小时前
【笔记】解决 ComfyUI 安装节点 ComfyUI-Addoor (葵花宝典)后启动报错:No module named ‘ComfyUI-Addoor’
linux·运维·前端·人工智能·windows·笔记·python
Shelley种了一只橙子21 小时前
第一章部署 chrony服务器
运维·服务器
Full Stack Developme21 小时前
Linux 有哪些功能相似的命令
linux·运维·服务器
馨谙21 小时前
Linux 服务管理:重新加载 vs 重新启动的本质区别
linux·运维·服务器
岚天start1 天前
Linux内核coredump分析方案
linux·运维·服务器·gdb·coredump·堆栈·内存快照