SSL 证书过期巡检脚本

本文涉及的产品
.cn 域名,1个 12个月
简介: SSL 证书过期巡检脚本

哈喽大家好,我是咸鱼

我们知道 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={
   
   mathJaxContainer[0]}{
   
   line} | awk -F':' '{print $1}')
    ip_pool={
   
   mathJaxContainer[1]}{
   
   line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')
    ...
done

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

for line in $(cat domain.txt)
do
    domain={
   
   mathJaxContainer[2]}{
   
   line} | awk -F':' '{print $1}')
    ip_pool={
   
   mathJaxContainer[3]}{
   
   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={
   
   mathJaxContainer[5]}{
   
   domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates -subject)
    done
done

我们着重看下检测命令

echo | openssl s_client -servername {
   
   mathJaxContainer[6]}{
   
   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={
   
   mathJaxContainer[7]}text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
end_timestamp={
   
   mathJaxContainer[8]}end_date" +%s) # 转换成时间戳
current_timestamp=$(date +%s) # 当前时间戳

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

remain_date={
   
   mathJaxContainer[9]}{
   
   end_timestamp} - ${current_timestamp}) / 86400 ))
if [[ {
   
   mathJaxContainer[10]}{
   
   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-20230726145807537.png

  • 证书快过期
    image-20230726150022920.png
  • 证书已过期
    image-20230726145938509.png

    完整脚本

for line in $(cat domain.txt)
do
        domain={
   
   mathJaxContainer[12]}{
   
   line} | awk -F':' '{print $1}')
        ip_pool={
   
   mathJaxContainer[13]}{
   
   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={
   
   mathJaxContainer[15]}{
   
   domain} -connect ${ip}:443 2>/dev/null | openssl x509 -noout -dates )
                # 判断命令是否执行成功,执行成功的话 text 变量里面是有内容的
                if [[ ${text} ]] 
                then
                    end_date={
   
   mathJaxContainer[16]}text" | grep -i "notAfter" | awk -F '=' '{print $2}') # 证书过期时间
                    end_timestamp={
   
   mathJaxContainer[17]}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: {
   
   mathJaxContainer[20]}{
   
   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
相关文章
|
存储 网络安全 Windows
接口测试|Charles证书的设置(抓HTTPS数据包)&SSL证书过期解决办法
接口测试|Charles证书的设置(抓HTTPS数据包)&SSL证书过期解决办法
接口测试|Charles证书的设置(抓HTTPS数据包)&SSL证书过期解决办法
|
Web App开发 运维 安全
SSL/TLS证书1年有效期新规已至,被“证书过期”支配的恐惧又增加了!
9月1日起,两年期公共SSL/TLS证书正式告别了行业,在三大浏览器(Apple Safari、 Google Chrome、Mozilla Firefox)的推动下,SSL/TLS证书最长有效期变更为13个月,同时,全球各大证书权威签发机构已停止签发有效期超过1年(398天)的SSL证书。
SSL/TLS证书1年有效期新规已至,被“证书过期”支配的恐惧又增加了!
|
网络安全 API 对象存储
SSL证书过期替换之踩坑总结
本文简要列出了阿里云ssl证书更新涉及到的服务及修改截图,供大家参考、补充和完善。
7836 0
|
6月前
|
安全 网络安全 数据安全/隐私保护
SSL证书过期后网站还能正常访问吗
SSL证书过期后,网站仍可访问,但浏览器会出现警告,降低用户信任度,增加数据安全风险。过期可能导致安全性下降、信任问题、浏览器限制及合规性风险。管理员需关注证书有效期,及时续费或更换,并选择可靠提供商。
SSL证书过期后网站还能正常访问吗
|
6月前
|
域名解析 安全 网络安全
使用Python自动检测SSL证书是否过期
使用Python自动检测SSL证书是否过期
187 0
|
监控 安全 算法
网站SSL证书过期了
网站SSL证书过期了
176 1
网站SSL证书过期了
|
6月前
|
应用服务中间件 Linux 网络安全
Linux【脚本 06】HTTPS转发HTTP安装OpenSSL、Nginx(with-http_ssl_module)及自签名的X.509数字证书生成(一键部署生成脚本分享)
Linux【脚本 06】HTTPS转发HTTP安装OpenSSL、Nginx(with-http_ssl_module)及自签名的X.509数字证书生成(一键部署生成脚本分享)
101 1
|
小程序 网络安全
5分钟教你SSL证书自动巡检与过期提醒
5分钟教你SSL证书自动巡检与过期提醒
513 2
|
小程序 应用服务中间件 网络安全
老板深夜打电话给我,“赶紧看下,网站SSL证书要过期了”
老板深夜打电话给我,“赶紧看下,网站SSL证书要过期了”
379 0
老板深夜打电话给我,“赶紧看下,网站SSL证书要过期了”
|
监控 Linux 网络安全
Domain Admin域名和SSL证书过期监控到期提醒
用于解决,不同业务域名SSL证书,申请自不同的平台,到期后不能及时收到通知,导致线上访问异常,被老板责骂的问题。同时,Domain Admin也是一个轻量级监控方案,占用系统资源较少,安装包仅1.5 MB。基于Python3 + Vue3.js 技术栈实现的域名和SSL证书监测平台。支持证书:单域名证书、多域名证书、通配符证书、IP证书、自签名证书。通知渠道:支持邮件、Webhook、企业微信、钉钉、飞书等通知方式。证书部署: 单一主机部署、多主机部署、动态主机部署。的过期监控,到期提醒。
768 3
Domain Admin域名和SSL证书过期监控到期提醒