SSL 证书过期巡检脚本 (Python 版)
哈喽大家好,我是咸鱼
之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《SSL 证书过期巡检脚本》),后台反响还是很不错的
那么今天咸鱼给大家介绍一下 python 版本的 SSL 证书过期巡检脚本 (完整代码在文末)
思路
导入相关模块
import ssl
import socket
import time
from datetime import datetime
首先我们创建一个 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
我们读取该文件,把里面的域名和对应的每个 ip 取出来,并存放到字典 domains 里面
domains = {}
with open('domain.txt', 'r', encoding='utf-8') as file:for line in file:domain, ip_pool = line.strip().split(':')domains[domain] = ip_pool.split(',')
取出来之后我们循环遍历字典,去获取每个域名对应的证书信息(ssl_connect 函数)
def ssl_connect(domain, ip):# 设置socket的超时时间为5秒socket.setdefaulttimeout(5)# 创建默认的SSL上下文context = ssl.create_default_context()# 创建一个SSL套接字skt = context.wrap_socket(socket.socket(), server_hostname=domain)try:# 建立SSL连接skt.connect((ip, 443))# 获取证书过期时间end_date = skt.getpeercert()['notAfter'].strip(' GMT')# 创建一个字典,存储本次连接中的域名、IP 地址和证书过期时间信息skt_info = {'domain': domain, 'ip': ip, 'end_date': end_date}except ssl.CertificateError as e:cert = eexcept socket.timeout:cert = 'Connect refused'except ConnectionResetError as e:cert = 'Connect reset' + str(e)except socket.gaierror as e:cert = 'Connnect gaierror'finally:# 关闭SSL套接字skt.close()return skt_info
ssl_connect 函数返回一个字典 skt_info,包含当前连接的域名、ip 地址和证书过期时间
# skt_info 内容
{'domain': 'www.baidu.com', 'ip': '180.101.50.242', 'end_date': 'Aug 6 01:51:05 2024'}
{'domain': 'www.baidu.com', 'ip': '180.101.50.188', 'end_date': 'Aug 6 01:51:05 2024'}
{'domain': 'www.bing.com', 'ip': '202.89.233.101', 'end_date': 'Aug 16 03:47:45 2023'}
{'domain': 'www.bing.com', 'ip': '202.89.233.100', 'end_date': 'Aug 16 03:47:45 2023'}
然后我们调用 check_cert_time 函数进行证书有效期检查和提示
info = [ssl_connect(domain, ip) for domain, ip_pool in domains.items() for ip in ip_pool]
[check_cert_time(i) for i in info]
check_cert_time 函数内容如下:
def check_cert_time(info):# 获取当前时间戳current_timestamp = int(time.time())# 将证书过期时间转换成时间戳date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y")end_timestamp = int(date_object.timestamp())# 计算剩余天数remain_day = (end_timestamp - current_timestamp) / 86400# 打印域名、IP 地址和证书过期时间信息print(f"域名:{info['domain']},ip 地址:{info['ip']},证书过期时间:{info['end_date']}")# 根据剩余天数进行不同的提示# 如果证书过期时间减去当前时间的天数小于七天的话,则提示需要准备更换证书了if 0 < remain_day < 7:print('剩余时间小于七天!请及时更换证书!')elif remain_day < 0:print('证书已过期!请及时更换证书!')else:print(f"剩余天数为:{remain_day:.2f}天\n")
最后我们执行一下代码,看看结果如何

完整代码
import ssl
import socket
import time
from datetime import datetimedef ssl_connect(domain, ip):# 设置socket的超时时间为5秒socket.setdefaulttimeout(5)# 创建默认的SSL上下文context = ssl.create_default_context()# 创建一个SSL套接字skt = context.wrap_socket(socket.socket(), server_hostname=domain)try:# 建立SSL连接skt.connect((ip, 443))# 获取证书过期时间end_date = skt.getpeercert()['notAfter'].strip(' GMT')# 创建一个字典,存储本次连接中的域名、IP 地址和证书过期时间信息skt_info = {'domain': domain, 'ip': ip, 'end_date': end_date}except ssl.CertificateError as e:cert = eexcept socket.timeout:cert = 'Connect refused'except ConnectionResetError as e:cert = 'Connect reset' + str(e)except socket.gaierror as e:cert = 'Connnect gaierror'finally:# 关闭SSL套接字skt.close()return skt_infodef check_cert_time(info):# 获取当前时间戳current_timestamp = int(time.time())# 将证书过期时间转换成时间戳date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y")end_timestamp = int(date_object.timestamp())# 计算剩余天数remain_day = (end_timestamp - current_timestamp) / 86400# 打印域名、IP 地址和证书过期时间信息print(f"域名:{info['domain']},ip 地址:{info['ip']},证书过期时间:{info['end_date']}")# 根据剩余天数进行不同的提示# 如果证书过期时间减去当前时间的天数小于七天的话,则提示需要准备更换证书了if 0 < remain_day < 7:print('剩余时间小于七天!请及时更换证书!')elif remain_day < 0:print('证书已过期!请及时更换证书!')else:print(f"剩余天数为:{remain_day:.2f}天\n")if __name__ == "__main__":domains = {}with open('domain.txt', 'r', encoding='utf-8') as file:for line in file:domain, ip_pool = line.strip().split(':')domains[domain] = ip_pool.split(',')info = [ssl_connect(domain, ip) for domain, ip_pool in domains.items() for ip in ip_pool][check_cert_time(i) for i in info]
相关文章:
SSL 证书过期巡检脚本 (Python 版)
哈喽大家好,我是咸鱼 之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《SSL 证书过期巡检脚本》),后台反响还是很不错的 那么今天咸鱼给大家介绍一下 python 版本的 SSL 证书过期巡检脚本 (完整代码…...
从0到1自学网络安全(黑客)【附学习路线图+配套搭建资源】
前言 网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的…...
Michael.W基于Foundry精读Openzeppelin第20期——EnumerableMap.sol
0. 版本 [openzeppelin]:v4.8.3,[forge-std]:v1.5.6 0.1 EnumerableMap.sol Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/utils/structs/EnumerableMap.sol EnumerableMap库提供了Bytes32ToB…...
深入探索二叉树:应用、计算和遍历
当涉及到二叉树的计算问题时,我们可以进一步介绍如何计算叶子节点数、树的宽度和叶子的深度,并解释三种常见的二叉树遍历方式:先序遍历、中序遍历和后序遍历。 1. 计算叶子节点数 叶子节点是指没有子节点的节点,也就是树中的末端…...
关于 1 + 1 = 2 的证明
1 1 2 首先是皮亚诺的自然数公理 意大利数学家皮亚诺提出的关于自然数的 5 5 5 条公理如下(定义 S ( x ) S(x) S(x) 为自然数 x x x 的后继): 0 0 0 是自然数每一个自然数 n n n 都有一个自然数后继记为 S ( n ) S(n) S(n) 0 0 0 不是…...
【C++】——内存管理
目录 回忆C语言内存管理C内存管理方式new deleteoperator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别 回忆C语言内存管理 void Test() {int* p1 (int*)malloc(sizeof(int));free(p1);int* p2 (int*)calloc(4…...
Jmeter录制HTTPS脚本
Jmeter录制HTTPS脚本 文章目录 添加“HTTP代理服务器”设置浏览器代理证书导入存在问题 添加“HTTP代理服务器” 设置浏览器代理 保持端口一致 证书导入 点击一下启动让jmeter自动生成证书,放在bin目录下: 打开jmeter的SSL管理器选择刚刚生成的证书&…...
Linux 的Centos 7 安装 启动 Google Chrome
我之所以在Centos上安装Chrome主要是为了让Web自动化测试工具可以启动Chrome,协助我做一些工作。 参考:centos7 google-chrome的安装与启动 - 简书 1.安装chrome逻辑 1. 下载安装包 2. 安装 3. 启动 》这就是在window上的逻辑,只是用命令行…...
DNS WEB HTTP
DNS与域名 网络是基于 TCP/IP 协议进行通信和连接的。 每一台主机都有唯一的标识,用于区别在网络上成千上万个用户和计算机。即固定的IP地址(32位二进制数转换成为十进制数——点分十进制)。每一个与网络相连接的计算机和服务器都被指派一个…...
微信小程序animation动画,微信小程序animation动画无限循环播放
需求是酱紫的: 页面顶部的喇叭通知,内容不固定,宽度不固定,就是做走马灯(轮播)效果,从左到右的走马灯(轮播),每播放一遍暂停 1500ms ~ 2000ms 刚…...
node.js
什么是Node.js Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序 概念: 使用Node.js编写后端程序 // 支持前端工程化 后端程序:提供接口和数据 ,网页资源 前端工程化:对代码压缩&…...
【微信小程序创作之路】- 小程序远程数据请求、获取个人信息
【微信小程序创作之路】- 小程序远程数据请求、获取个人信息 第七章 小程序远程数据请求、获取个人信息 文章目录 【微信小程序创作之路】- 小程序远程数据请求、获取个人信息前言一、远程数据请求1.本地环境2.正式域名 二、获取用户个人信息1.展示当前用户的身份信息2.获取用…...
XML基础知识讲解
文章目录 1. xml简介2. xml快速入门3. xml的元素(标签)定义4. xml标签的命名规范5. xml的属性定义和注释6. 转义字符7. CDATA区8. xml的处理指令9. xml的约束 1. xml简介 XML(eXtensible Markup Language)是一种用于描述数据的标记语。 它以纯文本的方…...
(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移
前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移,HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController (ZKFC&…...
Ubuntu下载deb包及其依赖包
一、简介 有时我们需要在离线环境使用提前准备好的deb包,然后只需要在新机器使用dpkg -i安装即可。 二、命令 apt-get download $(apt-rdepends (需要下载的包,可以有多个) | grep -v "^ " | sed s/debconf-2.0/debco…...
Ubuntu中解/压缩命令
一、zip文件 #解压 unzip filename.zip #压缩 zip filename.zip dirname # 递归处理,将指定目录下的所有文件和子目录一并压缩 zip -r filename.zip dirname 二、tar文件 # 解压 tar xvf FileName.tar # 压缩,将DirName和其下所有文件(夹)打包非压…...
剑指 Offer 12. 矩阵中的路径(回溯 DFS)
文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成ÿ…...
iceberg对比hive优势
1.事务性 从事务性上来说,iceberg具有更高的数据质量。 因为iceberg本质是一种table format,屏蔽了底层的存储细节,写入数据时候需要严格按照schema写入。而hive可以先写入底层数据,然后使用load partition的方式来加载分区。这样…...
ProgressBar基本使用
作用:进度条,用于展示某个任务的完成情况, 常用属性: 设定进度条的最大、最小值、自增步长 常用事件: 后台代码: private void progressBar1_Click(object sender, EventArgs e){Thread t;//使用线程执行…...
spring boot java使用XEasyPdf生成pdf文档
java使用XEasyPdf生成pdf文档 spring boot java使用XEasyPdf生成pdf文档第一步导入maven坐标,pom.xml全部贴上第二步编写代码代码实战: spring boot java使用XEasyPdf生成pdf文档 第一步导入maven坐标,pom.xml全部贴上 <?xml version"1.0" encoding…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
