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"}]
SSL证书监控

更多安全