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

  • ✅ 添加日志记录到文件
  • ✅ 支持从文件读取域名列表
  • ✅ 支持钉钉、飞书等多平台推送
  • ✅ 支持证书颁发者、签发时间等详细信息
相关推荐
Web3探索者4 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
荣--8 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森9 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务