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.注意事项
-
确保服务器能访问外网和目标域名的 443 端口
-
确保安装了
openssl
和curl
# Ubuntu/Debian sudo apt update && sudo apt install openssl curl -y # CentOS/RHEL sudo yum install openssl curl -y
-
企业微信机器人 Webhook Key 需要保密,不要提交到 Git
-
如需支持中文域名或 SNI,脚本已内置
-servername
参数支持
7.可选增强功能
- ✅ 添加日志记录到文件
- ✅ 支持从文件读取域名列表
- ✅ 支持钉钉、飞书等多平台推送
- ✅ 支持证书颁发者、签发时间等详细信息