SSL证书过期检查脚本
批量检查域名SSL证书过期时间,提前告警,支持邮件通知
详细内容
#!/bin/bash
# ==========================================
# SSL证书过期检查脚本
# 用途:批量检查域名SSL证书有效期,提前告警
# 使用方法:
# 1. 在 DOMAINS 数组中填写要检查的域名
# 2. bash ssl_check.sh
# 3. 可加入crontab每天执行
# ==========================================
# ========== 配置 ==========
DOMAINS=(
"example.com"
"www.example.com"
# 在此添加更多域名
)
WARN_DAYS=30 # 小于多少天告警
CRITICAL_DAYS=7 # 小于多少天严重告警
# 邮件配置(可选)
EMAIL_ALERT=false
EMAIL_TO="admin@example.com"
# ==========================
echo "========== SSL证书检查报告 =========="
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "告警阈值: ${WARN_DAYS}天 / 严重: ${CRITICAL_DAYS}天"
echo ""
WARN_LIST=""
CRITICAL_LIST=""
OK_COUNT=0
for DOMAIN in "${DOMAINS[@]}"; do
echo "检查: $DOMAIN"
# 获取证书信息
CERT_INFO=$(echo | openssl s_client -servername "$DOMAIN" -connect "${DOMAIN}:443" 2>/dev/null | openssl x509 -noout -dates -subject 2>/dev/null)
if [ -z "$CERT_INFO" ]; then
echo " ✗ 无法连接或获取证书"
CRITICAL_LIST="${CRITICAL_LIST}- ${DOMAIN}: 无法连接\n"
echo ""
continue
fi
# 提取过期时间
EXPIRY_DATE=$(echo "$CERT_INFO" | grep 'notAfter' | cut -d= -f2)
SUBJECT=$(echo "$CERT_INFO" | grep 'subject' | cut -d= -f2-)
# 计算剩余天数
EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s 2>/dev/null)
NOW_TS=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_TS - NOW_TS) / 86400 ))
echo " 主题: $SUBJECT"
echo " 过期时间: $EXPIRY_DATE"
if [ "$DAYS_LEFT" -le "$CRITICAL_DAYS" ]; then
echo " 🔴 严重: 仅剩 ${DAYS_LEFT} 天!"
CRITICAL_LIST="${CRITICAL_LIST}- ${DOMAIN}: 仅剩 ${DAYS_LEFT} 天 (过期: $EXPIRY_DATE)\n"
elif [ "$DAYS_LEFT" -le "$WARN_DAYS" ]; then
echo " 🟡 警告: 剩余 ${DAYS_LEFT} 天"
WARN_LIST="${WARN_LIST}- ${DOMAIN}: 剩余 ${DAYS_LEFT} 天 (过期: $EXPIRY_DATE)\n"
else
echo " 🟢 正常: 剩余 ${DAYS_LEFT} 天"
OK_COUNT=$((OK_COUNT + 1))
fi
echo ""
done
echo "========== 检查汇总 =========="
echo "正常: $OK_COUNT"
echo "警告: $(echo -e "$WARN_LIST" | grep -c '^-')"
echo "严重: $(echo -e "$CRITICAL_LIST" | grep -c '^-')"
echo ""
if [ -n "$WARN_LIST" ]; then
echo "【警告列表】"
echo -e "$WARN_LIST"
fi
if [ -n "$CRITICAL_LIST" ]; then
echo "【严重列表】"
echo -e "$CRITICAL_LIST"
fi
# 邮件告警
if [ "$EMAIL_ALERT" = true ] && { [ -n "$WARN_LIST" ] || [ -n "$CRITICAL_LIST" ]; }; then
SUBJECT="【SSL证书告警】$(date '+%Y-%m-%d')"
BODY="SSL证书检查告警:\n\n警告:\n${WARN_LIST}\n严重:\n${CRITICAL_LIST}"
echo -e "$BODY" | mail -s "$SUBJECT" "$EMAIL_TO"
echo "告警邮件已发送至: $EMAIL_TO"
fi
echo "========== 检查完成 =========="
适配环境
适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+
依赖环境:bash 4.0+
参数说明
[{"name": "DOMAINS", "label": "\u57df\u540d\u5217\u8868(\u6bcf\u884c\u4e00\u4e2a)", "type": "textarea", "default": "example.com"}, {"name": "WARN_DAYS", "label": "\u8b66\u544a\u5929\u6570", "default": "30"}, {"name": "CRITICAL_DAYS", "label": "\u4e25\u91cd\u5929\u6570", "default": "7"}]