从实列中学习linux shell15:如何利用shell 脚本 来检测 https域名ssl证书快过期问题,然后自动发邮件提示购买证书的功能

客户总想省钱,用免费安全证书。但有3个月到1年过期问题,我们如何提醒及时购买,而不影响使用

以下是一个用于检测HTTPS域名SSL证书过期并自动发送邮件提醒的Shell脚本示例:

第一步:准备脚本

#!/bin/bash

# 配置参数
THRESHOLD_DAYS=30                # 过期阈值(天)
EMAIL_ADDR="admin@example.com"    # 接收提醒的邮箱
DOMAINS_FILE="domains.txt"        # 域名列表文件路径
LOG_FILE="/var/log/ssl_check.log" # 日志文件路径

# 邮件主题和内容模板
SUBJECT_PREFIX="SSL证书过期警告"
MAIL_CONTENT="域名:%s 的SSL证书将在 %d 天后过期。\n过期日期:%s\n请及时续订或购买新的SSL证书。"

# 检查依赖项
command -v openssl >/dev/null 2>&1 || { echo "openssl 未安装,请先安装。"; exit 1; }
command -v mailx >/dev/null 2>&1 || { echo "mailx 未安装,请先安装。"; exit 1; }

# 日志记录函数
log() {
    echo "$(date "+%Y-%m-%d %H:%M:%S") - $1" >> "$LOG_FILE"
}

while read domain; do
    # 去除可能的空白字符
    domain=$(echo "$domain" | xargs)
    
    # 跳过空行和注释行
    if [[ -z "$domain" || "$domain" == \#* ]]; then
        continue
    fi

    log "正在检查域名: $domain"
    
    # 获取证书过期时间
    expiry_date=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep 'notAfter' | cut -d= -f2)
    
    if [ -z "$expiry_date" ]; then
        log "错误:无法获取 $domain 的证书信息"
        continue
    fi

    # 转换日期为时间戳(Linux系统)
    expiry_timestamp=$(date -d "$expiry_date" +%s 2>/dev/null)
    if [ -z "$expiry_timestamp" ]; then
        # macOS系统处理
        expiry_date_formatted=$(echo "$expiry_date" | awk '{print $1,$2,$3,$4,$5}')
        expiry_timestamp=$(date -j -f "%b %d %H:%M:%S %Y" "$expiry_date_formatted" +%s)
    fi

    current_timestamp=$(date +%s)
    days_remaining=$(( (expiry_timestamp - current_timestamp) / 86400 ))

    log "域名: $domain 剩余天数: $days_remaining"

    # 检查是否即将过期
    if [ "$days_remaining" -le "$THRESHOLD_DAYS" ]; then
        mail_subject="$SUBJECT_PREFIX: $domain 剩余 $days_remaining 天"
        mail_body=$(printf "$MAIL_CONTENT" "$domain" "$days_remaining" "$expiry_date")
        
        echo -e "$mail_body" | mailx -s "$mail_subject" "$EMAIL_ADDR"
        
        if [ $? -eq 0 ]; then
            log "已发送提醒邮件:$domain"
        else
            log "邮件发送失败:$domain"
        fi
    fi

done < "$DOMAINS_FILE"

log "检查完成"

第二步:使用说明

  1. 准备域名列表
    创建 domains.txt 文件,每行一个域名(支持以#开头的注释行):

    example.com
    github.com
    # 这是一个注释
    google.com
    
  2. 安装依赖

    • 确保系统已安装 opensslmailx
    • Ubuntu/Debian:
      sudo apt-get install openssl mailutils
      
    • CentOS/RHEL:
      sudo yum install openssl mailx
      
  3. 配置邮件发送
    根据系统配置邮件服务(如使用外部SMTP服务器,需修改/etc/mail.rc)。

  4. 设置定时任务
    使用crontab每天自动运行:

    # 每天上午9点运行
    0 9 * * * /path/to/ssl_check.sh
    

第三步:功能说明

  • 自动检测证书有效期:通过OpenSSL获取证书信息
  • 多域名支持:从文件读取域名列表
  • 动态阈值设置:可配置过期提醒阈值(默认30天)
  • 邮件提醒:发送包含详细信息的提醒邮件
  • 日志记录:记录检测过程和结果
  • 跨平台支持:兼容Linux和macOS系统

最后:注意事项

  1. 确保脚本有执行权限:

    chmod +x ssl_check.sh
    
  2. 首次运行前建议手动测试:

    ./ssl_check.sh
    
  3. 如果遇到证书验证问题,可能需要添加-verify_quiet参数忽略证书链验证

  4. 邮件服务需要正确配置,建议测试邮件功能:

    echo "测试邮件" | mailx -s "测试主题" your@email.com
    

可以根据实际需求调整阈值、邮件模板和日志路径等参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一刀到底211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值