织辉科技»论坛 技术科创 技术运维 查看内容

0 评论

1606 收藏

分享

用于检测 HTTPS 证书的有效期,并将即将到期的证书和访问异常的域名通过邮件发送通知

 

织辉科技温馨提醒:把部分功能需要登陆才能操作……

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 科技江湖 于 2024-10-31 19:23 编辑

一个 Bash 脚本,用于检测 HTTPS 证书的有效期,并将即将到期的证书和访问异常的域名通过邮件发送通知。以下是脚本实现思路:
send_mail 函数定义了一个发送邮件的功能,接受两个参数:邮件主题和邮件内容。使用 mail 命令发送邮件,并通过 $? 检查命令执行是否成功。
source /etc/profile 用于加载系统环境变量。
image.png
定义两个数组 expiring_certs 和 access_issues,分别用于存储即将到期的证书和访问异常的域名。
使用 while read line 循环读取 https_list 文件中的每行内容,每行内容预期是一个域名。
使用 openssl 命令获取每个域名的证书有效期,并存储在 end_time 变量中。如果获取失败,将域名添加到 access_issues 数组。
如果成功获取证书有效期,将其转换为 Unix 时间戳,并与当前时间戳进行比较,计算剩余天数。
根据剩余天数,将域名分类为已过期、即将到期、短期内到期或正常,并分别添加到 expiring_certs 数组。
循环结束后,检查 expiring_certs 和 access_issues 数组是否有内容。
如果有即将到期的证书或访问异常的域名,构建邮件主题和内容,并调用 send_mail 函数发送邮件。
新建https.sh文件,并存入下列代码
#!/bin/bash
# 定义发送邮件的函数
send_mail() {
    local subject="$1"
    local message="$2"
    echo "Sending email with subject: $subject"
    echo -e "$message" | mail -s "$subject" your-mail@qq.com
    if [[ $? -eq 0 ]]; then
        echo "Email sent successfully."
    else
        echo "Failed to send email."
    fi
}

# 检测https证书有效期

source /etc/profile

# 初始化数组
declare -a expiring_certs
declare -a access_issues

while read line; do
    end_time=$(echo | timeout 1 openssl s_client -servername "$line" -connect "$line":443 2>/dev/null | openssl x509 -noout -enddate 2> /dev/null | awk -F '=' '{print $2}')
    if [[ -z "$end_time" ]]; then
        echo "$line DNS解析异常或证书获取失败"
        access_issues+=("$line")
    else
        end_times=$(date -d "$end_time" +%s)
        current_times=$(date -d "$(date -u '+%b %d %T %Y GMT')" +%s)

        let left_time="$end_times - $current_times"
        days=$(expr $left_time / 86400)

        if [[ "${days}" -lt 0 ]]; then
            echo "警告:$line 证书已过期"
            expiring_certs+=("警告:$line已过期!\n")
        elif [[ "${days}" -lt 3 ]]; then
            echo "紧急:$line证书即将过期"
            expiring_certs+=("紧急:$line将在${days}天内过期!\n")
        elif [[ "${days}" -lt 6 ]]; then
            echo "注意:$line 证书将在${days}天后过期"
            expiring_certs+=("注意:$line将在${days}天后过期!\n")
        elif [[ "${days}" -lt 9 ]]; then
            echo "预知:$line 证书将在${days}天后过期"
            expiring_certs+=("预知:$line将在${days}天后过期!\n")
        else
            echo "$line 剩余天数: ${days}"
        fi
    fi
done < ./https_list

# 检查是否有证书即将到期或访问异常
if [[ ${#expiring_certs[@]} -gt 0 ]] || [[ ${#access_issues[@]} -gt 0 ]]; then
    subject="证书即将到期和访问异常警告"
    message="证书即将到期的域名:\n${expiring_certs}\n\n访问异常的域名:\n${access_issues}"
    send_mail "$subject" "$message"
fi

最后新建文件https_list,并放入需要监控的域名
image.png

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧

科技江湖
金牌编辑
主题 167
回复 0
粉丝 0