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. 确保安装了 openssl 和 curl

    复制代码
    # 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.可选增强功能

  • ✅ 添加日志记录到文件
  • ✅ 支持从文件读取域名列表
  • ✅ 支持钉钉、飞书等多平台推送
  • ✅ 支持证书颁发者、签发时间等详细信息
相关推荐
Lsetea3 分钟前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
Julien20041 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
十碗饭吃不饱1 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
好用斋1 小时前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
贝锐3 小时前
金仓、达梦、TDSQL全适配:向日葵补齐信创数据库层远程运维能力
运维·数据库·信创
程序开发阿元5 小时前
一台 20G 的 VPS 被日志吃掉一半:我按这个顺序查了二十分钟
linux·ssh
雪落漂泊6 小时前
Linux进程(四)概念:命令行参数和环境变量篇
linux·运维·服务器
方便面不加香菜6 小时前
Docker Container -- 容器命令详解
运维·docker·容器
say_fall6 小时前
【Linux系统编程】Linux进程信号:从“外卖到了“到内核里的一张位图
linux·运维·服务器·车载系统·智能硬件
Z21-X7 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生