当前位置: 首页 > news >正文

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)
dodomain=$(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)
dodomain=$(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}doecho -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 里面有内容,不为空
thendo 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 ]]
thenecho -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"echo -e "\e[31mip: ${ip}, ${domain}\e[0m"
elif [[ ${remain_date} -lt 0 ]]
thenecho -e "\e[31m证书已过期!请及时更换证书!\e[0m"
elseecho -e "\e[32m剩余天数为:${remain_date}\e[0m"
fi

我们来看下执行结果:

  • 证书未过期情况

在这里插入图片描述

  • 证书快过期
    在这里插入图片描述

  • 证书已过期
    在这里插入图片描述

完整脚本

for line in $(cat domain.txt)
dodomain=$(echo ${line} | awk -F':' '{print $1}')ip_pool=$(echo ${line} | awk -F '[a-z]:' '{print $2}' | sed 's/\,/ /g')for ip in ${ip_pool}doecho -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} ]] thenend_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 ]]thenecho -e "\e[31m剩余时间小于七天!请及时更换证书!\e[0m"echo -e "\e[31mip: ${ip}, ${domain}\e[0m"elif [[ ${remain_date} -lt 0 ]]thenecho -e "\e[31m证书已过期!请及时更换证书!\e[0m"elseecho -e "\e[32m剩余天数为:${remain_date}\e[0m"fielseecho -e "\e[31mError!${ip}\e[0m"echo -e "\e[31m${domain}\e[0m"fidone
done

相关文章:

SSL 证书过期巡检脚本

哈喽大家好,我是咸鱼 我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请。如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期 如果公…...

leetcode 面试题 01.03. URL化

⭐️ 题目描述 🌟 leetcode链接:面试题 01.03. URL化 思路: 计算出空格的个数,我们可以知道最后一个字符的位置 endPos,再从后 end 向前遍历若不是空格正常拷贝,是空格则替换成 %20,最终当空格…...

uni-app在小米手机上运行【步骤细节】

注意细节重点: 1.手机使用数据线与电脑连接,手机连接模式必须是传输文件模式 2.手机必须打开开发者模式 3.打开开发者模式后,仔细浏览并调整USB调试权限,重点打开USB是否允许安装按钮!!! 操作步…...

微信小程序实现日历功能、日历转换插件、calendar

文章目录 演示htmlJavaScript 演示 效果图 微信小程序实现交互 html <view wx:if"{{calendarArr.length}}"><view class"height_786 df_fdc_aic"><view class"grid_c7_104"><view class"font_weight_800 text_align…...

【浩鲸科技】济南Java后端面经

本文目录 写在前面试题总览题目解析1.说一下SpringBoot中常用的注解2.Redis中的基本数据类型3.TCP的网络协议4.java中常见的锁5.Hashmap的底层数据结构、底层源码、扩容机制源码6.java面向对象的特点 写在前面 关于这个专栏&#xff1a; 本专栏记录一些互联网大厂、小厂的面试实…...

VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

目录 一、VMware 虚拟机安装 &#xff08;1&#xff09;虚拟机创建及配置 &#xff08;2&#xff09;创建工作文件夹 二、克隆虚拟机 三、配置虚拟机的网络 &#xff08;1&#xff09;虚拟网络配置 &#xff08;2&#xff09;配置虚拟机 主机名 &#xff08;3&#xf…...

【Rust 基础篇】Rust关联类型:灵活的泛型抽象

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;其设计哲学是在不损失性能的前提下&#xff0c;保障代码的内存安全和线程安全。为了实现这一目标&#xff0c;Rust引入了"所有权系统"、"借用检查器"等特性&#xff0c;有效地避免了常见…...

学习笔记21 list

一、概述 有两种不同的方法来实现List接口。ArrayList类使用基于连续内存分配的实现&#xff0c;而LinkedList实现基于linked allocation。 list接口提供了一些方法&#xff1a; 二、The ArrayList and LinkedList Classes 1.构造方法 这两个类有相似的构造方法&#xff1a…...

微信小程序弱网监控

前言 在真实的项目中&#xff0c;我们为了良好的用户体验&#xff0c;会根据用户当前的网络状态提供最优的资源&#xff0c;例如图片或视频等比较大的资源&#xff0c;当网络较差时&#xff0c;可以提供分辨率更低的资源&#xff0c;能够让用户尽可能快的看到有效信息&#xf…...

【Linux】进程通信 — 共享内存

文章目录 &#x1f4d6; 前言1. 共享内存2. 创建共享内存2.1 ftok()创建key值&#xff1a;2.2 shmget()创建共享内存&#xff1a;2.3 ipcs指令&#xff1a;2.4 shmctl()接口&#xff1a;2.5 shmat()/shmdt()接口:2.6 共享内存没有访问控制&#xff1a;2.7 通过管道对共享内存进…...

“从零开始学习Spring Boot:快速搭建Java后端开发环境“

标题&#xff1a;从零开始学习Spring Boot&#xff1a;快速搭建Java后端开发环境 摘要&#xff1a;本文将介绍如何从零开始学习Spring Boot&#xff0c;并详细讲解如何快速搭建Java后端开发环境。通过本文的指导&#xff0c;您将能够快速搭建一个基于Spring Boot的Java后端开发…...

行为型-状态模式(State Pattern)

概述 状态模式是一种行为设计模式&#xff0c;它可以让对象在内部状态改变时改变它的行为。简而言之&#xff0c;状态模式允许对象在不同状态下更改其行为&#xff0c;而不需要通过使用大量的条件语句进行手动更改。 优点&#xff1a; 状态模式将与特定状态相关的行为分散到…...

大厂领导为什么喜欢跨层与下属聊天

作为一个在大厂里面浸淫十几年的loser&#xff0c;平时主要精力没用在技术提升上&#xff0c;对于大厂的人情世故各类八卦倒是研究的透彻。 如果你细心观察&#xff0c;会发现一些大的公司里面&#xff0c;领导喜欢跨层与下属去沟通聊天&#xff0c;我待过几家比较大的公司&am…...

Android 面试题 避免OOM(内存优化)三

&#x1f525; OOM介绍&#xff08;out of memory 内存溢出&#xff09;&#x1f525; Android和java中都会出现由于不良代码引起的内存泄露&#xff0c;为了使Android应用程序能够快速高效的运行&#xff0c;Android每个应用程序都会有专门Dalvik虚拟机实例来运行&#xff0c;…...

SpringBoot集成Lock4j 底层使用Redission 实现分布锁

Lock4j 在分布式系统中&#xff0c;实现锁的功能对于保证数据一致性和避免并发冲突是非常重要的。Lock4j是一个简单易用的分布式锁框架&#xff0c;而Redisson是一个功能强大的分布式解决方案&#xff0c;可以与Lock4j进行集成。 操作步骤 第一步&#xff1a;添加依赖 首先&…...

TortoiseSVN操作使用

说明 SVN常用于程序代码版本控制,由于业务需求需将生产资料通过SVN进行管控,涉及人员众多,权限分支管理需要细化,特此记录SVN的学习操作. 前言 版本控制是管理信息修改的艺术&#xff0c;它一直是程序员最重要的工具&#xff0c;程序员经常会花时间作出小的修改&#xff0c; 然…...

第五篇-ChatGLM2-6B模型下载

下载chatglm2-6b模型文件 https://huggingface.co/THUDM/chatglm2-6b方法一&#xff1a;huggingface页面直接点击下载 一个一个下载&#xff0c;都要下载方法二&#xff1a;snapshot_download下载文件 可以使用如下代码下载 创建下载环境 conda create --name hfhub pytho…...

【Matlab】基于长短期记忆网络的数据分类预测(Excel可直接替换数据)

【Matlab】基于长短期记忆网络的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 “基于长短期记忆网络的数据分类预测”是一种利用长短期记忆网络(Long Short-Term Memory, LSTM)进行数据分类任务…...

C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

1. TCP 套接字编程流程 1.1 概念 流式套接字编程针对TCP协议通信&#xff0c;即是面向对象的通信&#xff0c;分为服务端和客户端两部分。 1.2 服务端编程流程&#xff1a; 1&#xff09;加载套接字库&#xff08;使用函数WSAStartup()&#xff09;&#xff0c;创建套接字&…...

苍穹外卖-day07

苍穹外卖-day07 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...