Shell脚本实现SSL证书过期巡检

 更新时间:2023年08月04日 10:21:17   作者:咸鱼Linux运维  
我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请,如果没有及时更换证书的话,就有可能导致网站出问题,所以本文分享一个自动检测 SSL 是否过期的 shell 脚本吧

我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请。如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响

所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期

如果公司业务体量较大的话,肯定不止一个域名,而一个域名后面又会对应着多台机器,如果我们手动输入命令一台台检测的话,所需要的精力和时间是很大的

那么今天咸鱼跟大家介绍一个自己平常在用的自动检测 SSL 是否过期的 shell 脚本

思路

前面我们说到,一个公司(一个业务)底下可能会有多个域名多个 IP 地址,所以说我们需要整理出来放到一个文件里面,如下所示

#domain.txt
#域名:ip 池
www.baidu.com:180.101.50.242,180.101.50.188
www.bing.com:202.89.233.101,202.89.233.100

整理出来之后,后面只需要循环遍历 domain.txt 中的每一行内容,然后把域名和 ip 地址分别提取出来一个一个去检测就行了

首先我们对 domain.txt 中的内容进行循环遍历,提取出域名和 ip 池

for line in $(cat domain.txt)
do
	domain=$(echo ${line} | awk -F':' '{print $1}')
	ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
	...
done

然后再遍历 ip 池,取出每一个 ip 地址,然后执行检测命令,把检测到的结果存进 text 变量里

for line in $(cat domain.txt)
do
	domain=$(echo ${line} | awk -F':' '{print $1}')
	ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
	# 遍历 ip 池
    for ip in ${ip_pool}
    do
    	echo -e "\e[33m---------------start to check---------------\e[0m"
    	echo -e "ip:${ip}\ndomain:${domain}"
        # 检测命令
    	text=$(echo | openssl s_client -servername ${domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates -subject)
    done
done

我们着重看下检测命令

echo | openssl s_client -servername ${domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates -subject
  • echo: 这个命令用于向标准输出打印一个空行
  • openssl s_client -servername www.baidu.com -connect 180.101.50.242:443: 这部分命令使用 openssl 工具来建立一个与指定网站的 SSL 连接。 -servername选项指定了要连接的服务器的主机名-connect 选项指定了服务器的 IP 地址和端口号)
  • 2>/dev/null: 这部分是重定向,将标准错误输出重定向到 /dev/null 设备文件,这样连接服务器的时候如果报错错误信息就不会显示在终端上
  • openssl x509 -noout -dates: 这部分命令用于提取 SSL 证书的有效期和主题信息。openssl x509是用于处理 X.509 证书的命令,-noout选项表示不打印证书本身,而是打印其他信息,-dates 选项表示打印证书的有效期

输出信息如下(即 text 变量内容)

# echo | openssl s_client -servername www.baidu.com -connect 180.101.50.242:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Jul  6 01:51:06 2023 GMT
notAfter=Aug  6 01:51:05 2024 GMT

其中 notBefore 是开始时间,notAfter 是过期时间

需要注意的是,如果提取不到 SSL 证书的信息,那么 text 里面是没有内容的,所以在检测过期时间之前我们需要判断一下

if [[ ${text} ]] # text 里面有内容,不为空
then
	do something
fi

然后我们提取出输出的 SSL 证书信息中 notAfter 的值,然后转换成时间戳的形式,并且求出当前的时间戳

end_date=$(echo "$text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
end_timestamp=$(date -d "$end_date" +%s) # 转换成时间戳
current_timestamp=$(date +%s) # 当前时间戳

最后我们用过期时间减去当前时间,得出剩余时间,再对剩余时间做判断

remain_date=$(( (${end_timestamp} - ${current_timestamp}) / 86400 ))
if [[ ${remain_date} -lt 7 && ${remain_date} -ge 0 ]]
then
	echo -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"
	echo -e "\e[31mip: ${ip}, ${domain}\e[0m"
elif [[ ${remain_date} -lt 0 ]]
then
	echo -e "\e[31m证书已过期!请及时更换证书!\e[0m"
else
	echo -e "\e[32m剩余天数为:${remain_date}\e[0m"
fi

我们来看下执行结果:

证书未过期情况

证书快过期

证书已过期

完整脚本

for line in $(cat domain.txt)
do
        domain=$(echo ${line} | awk -F':' '{print $1}')
        ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
        for ip in ${ip_pool}
        do
                echo -e "\e[33m---------------start to check---------------\e[0m"
                echo -e "ip:${ip}\ndomain:${domain}"
                text=$(echo | openssl s_client -servername ${domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates )
                # 判断命令是否执行成功,执行成功的话 text 变量里面是有内容的
                if [[ ${text} ]] 
                then
                    end_date=$(echo "$text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
                    end_timestamp=$(date -d "$end_date" +%s) # 转换成时间戳
                    current_timestamp=$(date +%s) # 当前时间戳
                    # 如果证书过期时间减去当前时间的天数小于七天的话,则提示需要准备更换证书了
                    remain_date=$(( (${end_timestamp} - ${current_timestamp}) / 86400 ))
                    if [[ ${remain_date} -lt 7 && ${remain_date} -ge 0 ]]
                    then
                        echo -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"
                        echo -e "\e[31mip: ${ip}, ${domain}\e[0m"
                    elif [[ ${remain_date} -lt 0 ]]
                    then
                        echo -e "\e[31m证书已过期!请及时更换证书!\e[0m"
                    else
                        echo -e "\e[32m剩余天数为:${remain_date}\e[0m"
                    fi
                else
                            echo -e "\e[31mError!${ip}\e[0m"
                            echo -e "\e[31m${domain}\e[0m"
                fi
        done
done

到此这篇关于Shell脚本实现SSL证书过期巡检的文章就介绍到这了,更多相关SSL证书过期巡检内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell编程条件测试的实现

    Shell编程条件测试的实现

    Shell脚本的条件测试可以用于测试字符串、文件状态和数字。本文就详细的介绍一下Shell编程条件测试,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • linux命令切换目录的使用方法

    linux命令切换目录的使用方法

    切换目录的方式有很多种,最常用的莫过于cd 命令了,这里介绍四个命令pushd,popd,dirs,cd -的使用方法
    2014-01-01
  • bash shell和dash shell的区别详解

    bash shell和dash shell的区别详解

    本文主要介绍了bash shell和dash shell的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Linux查找占用的端口,并终止进程的方法

    Linux查找占用的端口,并终止进程的方法

    下面小编就为大家带来一篇Linux查找占用的端口,并终止进程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录

    Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录

    这篇文章主要介绍了Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录,需要的朋友可以参考下
    2015-04-04
  • 在多个 Linux 服务器上运行多个命令的操作指南

    在多个 Linux 服务器上运行多个命令的操作指南

    如果你正在管理多台 Linux 服务器,并且你想在所有 Linux 服务器上运行多个命令,但你不知道该怎么做,不用担心,本文我们将向您展示如何在多个 Linux 服务器上同时运行多个命令,需要的朋友可以参考下
    2023-07-07
  • Linux下使用Shell脚本实现进程监控的流程

    Linux下使用Shell脚本实现进程监控的流程

    这篇文章主要介绍了Linux下使用Shell脚本实现进程监控,在 Linux 平台下,shell 脚本监控是一个非常简单、方便的工具,它可以有效的对服务器、进程进行监控,对系统开发以及进程维护人员非常有帮助,需要的朋友可以参考下
    2023-02-02
  • win10下如何运行.sh文件的实现步骤

    win10下如何运行.sh文件的实现步骤

    这篇文章主要介绍了win10下如何运行.sh文件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Gearman::XS在Centos下的编译安装方法

    Gearman::XS在Centos下的编译安装方法

    这篇文章主要介绍了Gearman::XS在Centos下的编译安装方法,需要的朋友可以参考下
    2014-07-07
  • Linux shell命令统计某列去重后的值

    Linux shell命令统计某列去重后的值

    今天小编就为大家分享一篇关于Linux shell命令统计某列去重后的值,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论