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.可选增强功能

  • ✅ 添加日志记录到文件
  • ✅ 支持从文件读取域名列表
  • ✅ 支持钉钉、飞书等多平台推送
  • ✅ 支持证书颁发者、签发时间等详细信息
相关推荐
有毒的教程8 分钟前
SaltStack 开源自动化运维工具详细介绍
运维·开源·saltstack
大房身镇、王师傅19 分钟前
【VirtualBox】VirtualBox 7.1.6 RockyLinux10 配置增强功能 设置共享目录
运维·服务器·virtualbox·rockylinux10
betazhou28 分钟前
rsync使用案例分析
linux·运维·服务器·rsync·同步数据
minglie12 小时前
谷歌浏览器搜索技巧
运维
脑子进水养啥鱼?2 小时前
Linux find 命令
linux·运维
007张三丰2 小时前
git中的SSH 公钥配置详细指南(GitHub、GitLab、Gitee平台适用)
git·ssh·github
曹天骄3 小时前
Cloudflare Worker 关联域名访问后出现301 / 308
运维·云计算
EverydayJoy^v^3 小时前
RH124简单知识点——第8章——配置和保护SSH
linux·运维·ssh
@zulnger3 小时前
数据提取_1
运维·服务器
淮北4943 小时前
GDB在ubuntu上的安装与使用
linux·运维·ubuntu