翼度科技»论坛 云主机 LINUX 查看内容

SSL 证书过期巡检脚本

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
哈喽大家好,我是咸鱼
我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请。如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响
所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期
如果公司业务体量较大的话,肯定不止一个域名,而一个域名后面又会对应着多台机器,如果我们手动输入命令一台台检测的话,所需要的精力和时间是很大的
那么今天咸鱼跟大家介绍一个自己平常在用的自动检测 SSL 是否过期的 shell 脚本
思路

前面我们说到,一个公司(一个业务)底下可能会有多个域名多个 IP 地址,所以说我们需要整理出来放到一个文件里面,如下所示
  1. #domain.txt
  2. #域名:ip 池
  3. www.baidu.com:180.101.50.242,180.101.50.188
  4. www.bing.com:202.89.233.101,202.89.233.100
复制代码
整理出来之后,后面只需要循环遍历 domain.txt 中的每一行内容,然后把域名和 ip 地址分别提取出来一个一个去检测就行了
首先我们对 domain.txt 中的内容进行循环遍历,提取出域名和 ip 池
  1. for line in $(cat domain.txt)
  2. do
  3.         domain=$(echo ${line} | awk -F':' '{print $1}')
  4.         ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
  5.         ...
  6. done
复制代码
然后再遍历 ip 池,取出每一个 ip 地址,然后执行检测命令,把检测到的结果存进 text 变量里
  1. for line in $(cat domain.txt)
  2. do
  3.         domain=$(echo ${line} | awk -F':' '{print $1}')
  4.         ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
  5.        
  6.         # 遍历 ip 池
  7.     for ip in ${ip_pool}
  8.     do
  9.             echo -e "\e[33m---------------start to check---------------\e[0m"
  10.             echo -e "ip:${ip}\ndomain:${domain}"
  11.         
  12.         # 检测命令
  13.             text=$(echo | openssl s_client -servername ${domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates -subject)
  14.     done
  15. done
复制代码
我们着重看下检测命令
  1. 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 变量内容)
  1. # echo | openssl s_client -servername www.baidu.com -connect 180.101.50.242:443 2>/dev/null | openssl x509 -noout -dates
  2. notBefore=Jul  6 01:51:06 2023 GMT
  3. notAfter=Aug  6 01:51:05 2024 GMT
复制代码
其中 notBefore 是开始时间,notAfter 是过期时间
需要注意的是,如果提取不到 SSL 证书的信息,那么  text  里面是没有内容的,所以在检测过期时间之前我们需要判断一下
  1. if [[ ${text} ]] # text 里面有内容,不为空
  2. then
  3.         do something
  4. fi
复制代码
然后我们提取出输出的 SSL 证书信息中 notAfter  的值,然后转换成时间戳的形式,并且求出当前的时间戳
  1. end_date=$(echo "$text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
  2. end_timestamp=$(date -d "$end_date" +%s) # 转换成时间戳
  3. current_timestamp=$(date +%s) # 当前时间戳
复制代码
最后我们用过期时间减去当前时间,得出剩余时间,再对剩余时间做判断
  1. remain_date=$(( (${end_timestamp} - ${current_timestamp}) / 86400 ))
  2. if [[ ${remain_date} -lt 7 && ${remain_date} -ge 0 ]]
  3. then
  4.         echo -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"
  5.         echo -e "\e[31mip: ${ip}, ${domain}\e[0m"
  6. elif [[ ${remain_date} -lt 0 ]]
  7. then
  8.         echo -e "\e[31m证书已过期!请及时更换证书!\e[0m"
  9. else
  10.         echo -e "\e[32m剩余天数为:${remain_date}\e[0m"
  11. fi
复制代码
我们来看下执行结果:

  • 证书未过期情况

  • 证书快过期

  • 证书已过期

完整脚本
  1. for line in $(cat domain.txt)
  2. do
  3.         domain=$(echo ${line} | awk -F':' '{print $1}')
  4.         ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
  5.         for ip in ${ip_pool}
  6.         do
  7.                 echo -e "\e[33m---------------start to check---------------\e[0m"
  8.                 echo -e "ip:${ip}\ndomain:${domain}"
  9.                
  10.                 text=$(echo | openssl s_client -servername ${domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates )
  11.                 # 判断命令是否执行成功,执行成功的话 text 变量里面是有内容的
  12.                 if [[ ${text} ]]
  13.                 then
  14.                     end_date=$(echo "$text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
  15.                     end_timestamp=$(date -d "$end_date" +%s) # 转换成时间戳
  16.                     
  17.                     current_timestamp=$(date +%s) # 当前时间戳
  18.                     
  19.                     # 如果证书过期时间减去当前时间的天数小于七天的话,则提示需要准备更换证书了
  20.                     remain_date=$(( (${end_timestamp} - ${current_timestamp}) / 86400 ))
  21.                     if [[ ${remain_date} -lt 7 && ${remain_date} -ge 0 ]]
  22.                     then
  23.                         echo -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"
  24.                         echo -e "\e[31mip: ${ip}, ${domain}\e[0m"
  25.                     elif [[ ${remain_date} -lt 0 ]]
  26.                     then
  27.                         echo -e "\e[31m证书已过期!请及时更换证书!\e[0m"
  28.                     else
  29.                         echo -e "\e[32m剩余天数为:${remain_date}\e[0m"
  30.                     fi
  31.                 else
  32.                             echo -e "\e[31mError!${ip}\e[0m"
  33.                             echo -e "\e[31m${domain}\e[0m"
  34.                 fi
  35.         done
  36. done
复制代码
来源:https://www.cnblogs.com/edisonfish/p/17583358.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具