首页 > 其他分享 >SSL 证书过期巡检脚本

SSL 证书过期巡检脚本

时间:2023-07-26 19:22:40浏览次数:38  
标签:巡检 domain 证书 过期 ip openssl echo SSL date

哈喽大家好,我是咸鱼

我们知道 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
  1. echo: 这个命令用于向标准输出打印一个空行
  2. openssl s_client -servername www.baidu.com -connect 180.101.50.242:443: 这部分命令使用 openssl 工具来建立一个与指定网站的 SSL 连接。 -servername选项指定了要连接的服务器的主机名-connect 选项指定了服务器的 IP 地址和端口号)
  3. 2>/dev/null: 这部分是重定向,将标准错误输出重定向到 /dev/null 设备文件,这样连接服务器的时候如果报错错误信息就不会显示在终端上
  4. 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

我们来看下执行结果:

  • 证书未过期情况
    image

  • 证书快过期
    image

  • 证书已过期
    image

完整脚本

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

标签:巡检,domain,证书,过期,ip,openssl,echo,SSL,date
From: https://www.cnblogs.com/edisonfish/p/17583358.html

相关文章

  • openssl-rpm包制作
    上传需要编译的tar包,如:openssl-1.1.1t.tar.gz上传完成后,依次在命令行中,输入以下代码:set-eset-vmkdir~/openssl&&cd~/opensslyum-yinstallcurlwhichmakegccperlperl-WWW-Curlrpm-buildcp/root/openssl-1.1.1t.tar.gz./cat<<'EOF'>~/openss......
  • python读取linux巡检
    Python读取Linux巡检作为一名经验丰富的开发者,我将教会你如何使用Python读取Linux巡检报告。下面是整个流程的步骤:步骤描述1.连接到Linux服务器使用ssh库建立与Linux服务器的连接2.执行巡检命令使用paramiko库执行巡检命令3.保存巡检结果将巡检结果保存到......
  • 手动r删除redis过期的key
    如何手动删除Redis过期的Key介绍在使用Redis时,经常会遇到Key过期的情况。Redis提供了自动过期机制,但有时候我们需要手动删除过期的Key。本文将介绍如何手动删除Redis过期的Key,以及每一步所需的代码。整体流程下面是手动删除Redis过期Key的整体流程。步骤......
  • visual studio community 2017 许可证即将过期
     打开发现通知,许可证即将过期点击后如图所示发现点击更新后根本没用,打不开其内容,看了数个文章,尝试后发现这是只需要关闭wifi(PS:比如校园网等),打开使用自己的热点进行连接即可进去加载页面然后根据提示进行简单操作即可,我使qq邮箱登录的社区版,这样微软直接给你发个qq邮箱验......
  • jmeter 使用https协议(jmeter不添加ssl证书的解决方案)
    使用https协议时,jmeter不添加ssl证书的解决方法:使用https协议,访问时将域名替换成真实的IP地址及端口号,如下图: ......
  • 自动更新ssl证书
     @echooffsetlocalset"nginx_home=C:\phpEnv\server\nginx"set"nginx_ssl_path=C:\phpEnv\server\nginx\certs\"(opensslx509-in%nginx_ssl_path%\rxn.crt-checkend86400)|findstr/c:"not">nulif%errorlevel%......
  • Java生成SSL自签名证书及解析(keytool方式和源码方式)
    一:序当需要在Java应用程序中使用SSL/TLS加密通信或进行身份验证时,证书是必不可少的。证书可以用来验证服务器的身份,并确保通信的安全性。在Java开发中,可以使用JDK自带的keytool工具生成自签名证书。而本文将介绍如何使用JDK的keytool工具生成自签名证书以及相......
  • SSL证书种类功能对比:企业该如何选择DV、 OV、EV
    选择一款合适的SSL证书是企业网站进行HTTPS访问的第一步。不同类型SSL证书在功能和验证要求上有所不同,企业应根据自身需求选择合适的证书。本文将介绍DV、OV、EV三种SSL证书的区别,以及企业选择SSL证书的建议。企业对SSL证书的要求要远高于个人网站,因为大多数企业网站可能存在着......
  • java中tomcat 加载动态库XXX.dll报错“java.lang.UnsatisfiedLinkError: already load
    错误:在Tomcat项目和supermapiserverwar包中使用了相同的supermapjavaiobject【四个jar包】,实际的访问过程如下:这时候在访问Tomcat的时候,就会出现一个错误:anexceptioncaughtatEnvironment.loadLibrary(),programwillcontinuerunning.java.lang.UnsatisfiedL......
  • redis自动刷新过期时间
    Redis自动刷新过期时间Redis是一个开源的内存数据库,它提供了一些强大的功能,如缓存、消息队列和键值存储等。在缓存应用中,我们经常会遇到一个问题,就是如何处理缓存的过期时间。当缓存过期后,我们需要从数据库中重新加载数据,并将其重新设置到Redis中。为了解决这个问题,我们可以使用Re......