翼度科技»论坛 编程开发 python 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
哈喽大家好,我是咸鱼
之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《SSL 证书过期巡检脚本》),后台反响还是很不错的
那么今天咸鱼给大家介绍一下 python 版本的 SSL 证书过期巡检脚本 (完整代码在文末)
思路

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

完整代码
  1. import ssl
  2. import socket
  3. import time
  4. from datetime import datetimedef ssl_connect(domain, ip):
  5.     # 设置socket的超时时间为5秒
  6.     socket.setdefaulttimeout(5)
  7.     # 创建默认的SSL上下文
  8.     context = ssl.create_default_context()
  9.     # 创建一个SSL套接字
  10.     skt = context.wrap_socket(socket.socket(), server_hostname=domain)
  11.     try:
  12.         # 建立SSL连接
  13.         skt.connect((ip, 443))
  14.         # 获取证书过期时间
  15.         end_date = skt.getpeercert()['notAfter'].strip(' GMT')
  16.         # 创建一个字典,存储本次连接中的域名、IP 地址和证书过期时间信息
  17.         skt_info = {'domain': domain, 'ip': ip, 'end_date': end_date}
  18.     except ssl.CertificateError as e:
  19.         cert = e
  20.     except socket.timeout:
  21.         cert = 'Connect refused'
  22.     except ConnectionResetError as e:
  23.         cert = 'Connect reset' + str(e)
  24.     except socket.gaierror as e:
  25.         cert = 'Connnect gaierror'
  26.     finally:
  27.         # 关闭SSL套接字
  28.         skt.close()
  29.     return skt_infodef check_cert_time(info):
  30.     # 获取当前时间戳
  31.     current_timestamp = int(time.time())
  32.     # 将证书过期时间转换成时间戳
  33.     date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y")
  34.     end_timestamp = int(date_object.timestamp())
  35.     # 计算剩余天数
  36.     remain_day = (end_timestamp - current_timestamp) / 86400
  37.     # 打印域名、IP 地址和证书过期时间信息
  38.     print(f"域名:{info['domain']},ip 地址:{info['ip']},证书过期时间:{info['end_date']}")
  39.     # 根据剩余天数进行不同的提示
  40.     # 如果证书过期时间减去当前时间的天数小于七天的话,则提示需要准备更换证书了
  41.     if 0 < remain_day < 7:
  42.         print('剩余时间小于七天!请及时更换证书!')
  43.     elif remain_day < 0:
  44.         print('证书已过期!请及时更换证书!')
  45.     else:
  46.         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]
复制代码



来源:https://www.cnblogs.com/edisonfish/p/17604403.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具