Python实现检测SSL证书是否过期

 更新时间:2023年08月04日 10:25:29   作者:咸鱼Linux运维  
我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请,如果没有及时更换证书的话,就有可能导致网站出问题,所以本文介绍了如何利用Python实现检测SSL证书是否过期,需要的可以参考下

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

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

完整代码

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]

到此这篇关于Python实现检测SSL证书是否过期的文章就介绍到这了,更多相关Python检测SSL是否过期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于opencv和pillow实现人脸识别系统(附demo)

    基于opencv和pillow实现人脸识别系统(附demo)

    人脸识别就是一个程序能识别给定图像或视频中的人脸,本文主要介绍了opencv和pillow实现人脸识别系统,本文不涉及分类器、训练识别器等算法原理,感兴趣的可以了解一下
    2021-11-11
  • python数据分析之单因素分析线性拟合及地理编码

    python数据分析之单因素分析线性拟合及地理编码

    这篇文章主要介绍了python数据分析之单因素分析线性拟合及地理编码,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Python人工智能之波士顿房价数据分析

    Python人工智能之波士顿房价数据分析

    买房应该是大多数都会要面临的一个选择,当前经济和政策背景下,未来房价会涨还是跌?这是很多人都关心的一个话题。今天分享的这篇文章,以波士顿的房地产市场为例,根据低收入人群比例、老师学生数量等特征,利用 Python 进行分析,不求买房但求技术
    2021-11-11
  • python迭代器,生成器详解

    python迭代器,生成器详解

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,小编觉得这篇文章写的还不错,需要的朋友可以参考下
    2021-10-10
  • python中threading.Semaphore和threading.Lock的具体使用

    python中threading.Semaphore和threading.Lock的具体使用

    python中的多线程是一个非常重要的知识点,本文主要介绍了python中threading.Semaphore和threading.Lock的具体使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-08-08
  • Python xmltodict模块安装及代码实例

    Python xmltodict模块安装及代码实例

    这篇文章主要介绍了Python xmltodict模块安装及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 解决Python在导入文件时的FileNotFoundError问题

    解决Python在导入文件时的FileNotFoundError问题

    这篇文章主要介绍了解决Python在导入文件时的FileNotFoundError问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 详解Python3 中的字符串格式化语法

    详解Python3 中的字符串格式化语法

    字符串的格式化方法分为两种,分别为占位符(%)和format方式。这篇文章主要介绍了Python3 中的字符串格式化语法问题,需要的朋友可以参考下
    2020-01-01
  • Python借助with语句实现代码段只执行有限次

    Python借助with语句实现代码段只执行有限次

    这篇文章主要介绍了Python借助with语句实现代码段只执行有限次,首先要定义一个能够在with语句中使用的类实现enter和exit,下文详细介绍需要的小伙伴可以参考一下
    2022-03-03
  • python 获取剪切板内容的两种方法

    python 获取剪切板内容的两种方法

    这篇文章主要介绍了python 获取剪切板内容的两种方法,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-11-11

最新评论