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实现人脸识别系统,本文不涉及分类器、训练识别器等算法原理,感兴趣的可以了解一下2021-11-11python中threading.Semaphore和threading.Lock的具体使用
python中的多线程是一个非常重要的知识点,本文主要介绍了python中threading.Semaphore和threading.Lock的具体使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2023-08-08解决Python在导入文件时的FileNotFoundError问题
这篇文章主要介绍了解决Python在导入文件时的FileNotFoundError问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-04-04
最新评论