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

  • ✅ 添加日志记录到文件
  • ✅ 支持从文件读取域名列表
  • ✅ 支持钉钉、飞书等多平台推送
  • ✅ 支持证书颁发者、签发时间等详细信息
相关推荐
Joy T4 小时前
【AI运维】02 云上基础部署:ECS、OSS 与 Nginx 的体系化理解与实践
运维·nginx
石小千6 小时前
Nexus升级(3.63.0--3.87.1)
运维
魂万劫7 小时前
如何在虚拟机VM上|Linux环境内安装windows
linux·运维·服务器·windows
数字化转型20258 小时前
SAP Signavio 在风机制造行业的深度应用研究
大数据·运维·人工智能
WordPress学习笔记8 小时前
wordpress根据分类ID调用分类名称和分类描述
运维·wordpress
qq_455760859 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器
九思x10 小时前
Linux 系统安装 JDK 17
linux·运维
HIT_Weston11 小时前
77、【Ubuntu】【Hugo】搭建私人博客:Detached HEAD
linux·运维·ubuntu
再睡一夏就好11 小时前
多线程并发编程核心:互斥与同步的深度解析及生产者消费者模型两种实现
linux·运维·服务器·jvm·c++·笔记
码农胖虎-java12 小时前
技术深析:Delayed ACK与Nagle算法的“相爱相杀”
运维·服务器·网络