首页 > 编程语言 >SSL 证书过期巡检脚本 (Python 版)

SSL 证书过期巡检脚本 (Python 版)

时间:2023-08-03 20:46:07浏览次数:42  
标签:info domain end 证书 Python ip SSL date 过期

哈喽大家好,我是咸鱼

之前写了个 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 = e
    except 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")

最后我们执行一下代码,看看结果如何
image

完整代码

import ssl
import socket
import time
from datetime import datetime


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 = e
    except 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


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")



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]

标签:info,domain,end,证书,Python,ip,SSL,date,过期
From: https://www.cnblogs.com/edisonfish/p/17604403.html

相关文章

  • x86_64 ubuntu22.04环境下编译版本python3.13.0 alpha 0源码——python3.13.0 alpha 0
      python3.13.0alpha0版本源码编译: 环境——x86_64ubuntu22.04系统: 1.源码下载:gitclonehttps://github.com/python/cpython 2.修改apt源地址:编辑文件:sudovim/etc/apt/sources.list添加内容:deb-srchttp://archive.ubuntu.com/ubuntu/jammymain......
  • PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本
    PEP703的内容是什么,意义又是什么呢?可以说python的官方接受的no-GIL提议的PEP就是PEP703给出的,如果GIL帧的从python中移除那么可以说对整个python生态圈将有着跨越性发展的意义。  ====================================================  PEP703地址:https://peps.p......
  • 【python系列】手把手教你在pypi发布自己的包-他人可pip下载
    前言最近在写一个接口执行引擎用作于接口自动化测试平台的核心。看了挺多资料,做了挺多事情,学了挺多乱七八糟的知识,笔记记得乱糟糟的,以至于一直没有整理发文(啊其实我就是懒),各位见谅。正文如下目前该引擎可以通过pip直接下载,但内容我还在写,预计这个月会完成(大概也许可能可以。)pypi发......
  • 自动生成python程序调用关系逻辑图
    前言你是否因为看一个程序或者运行一个框架,不知道他的运行流程?自己想写一个运行流程却觉得麻烦无从下手?graphviz+pycallgraph帮你绘制让领导看了都拍桌子称赞你的python程序逻辑调用关系图!先来看一下我这段时间在写的一个框架的部分流程吧~密密麻麻,真的哈人,完整的更哈人。狗看了都......
  • python-windows命令行启动appium及杀掉对应接口进程
    文章目录windows命令行启动appium及杀掉对应接口进程一.环境配置1.安装命令行版appium2.安装appium-doctor检测3.python安装Appium-Python-Client:4.定位uiautomatorviewer.bat5.查看主包名主类名Activity二.python-appium启动app1.appium启动一加计算器相关参数:2.windows查看端口......
  • python面试题
    基础篇1.为什么学习PythonPython语言简单易懂,上手容易,随着AI风潮,越来越火2.解释型和编译型语言的区别编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python,(Java有些......
  • python中的注释noqa: F401
    在Python中,"noqa:F401"是一个特殊的注释指示。它主要用于在静态代码检查工具(例如Flake8)运行时,告知工具忽略特定的"F401"错误。"F401"是Flake8静态代码检查工具中的一种错误代码。具体来说,它表示"moduleimportedbutunused",即导入了模块但未在代码中使用。通常情况下,代......
  • Python 导出传感器数据到 .csv 文件
    导出传感器的数据一共分为两步:构建数据结构;导出数据到.csv文件。1.构建数据结构一般来说,传感器采集的数据为时间序列数据。需要导出的数据一般为:times=[t1,t2,t3...tn]value_A=[a1,a2,a3...an]value_B=[b1,b2,b3...bn]value_C=[c1,c2,c3...cn......
  • 快餐数据分析--Python数据分析实例
    1、读取数据importpandasaspddf=pd.read_csv('快餐数据.tsv',sep='\t')print(df)2、查看基本信息查看前五条数据df.head()查看整体信息df.info()可以看到,一共有4622条数据,只有choice_description列有缺失值,item_price为object类型是因为价格前面有$符号。打印列名......
  • Python绘制多种形式的条形图(柱状图)
    绘图前的准备因为涉及到中文显示,所以需要用两行代码解决中文乱码问题importnumpyasnpfrommatplotlibimportpyplotaspltplt.rcParams['font.sans-serif']=[u'SimHei']#SimHei就是中文字体#因为设置了中文后,负号就乱码了,所以还要设置负号的编码plt.rcParams['axes.......