哈喽大家好,我是咸鱼

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

SSL 证书过期巡检脚本 (Python 版)的更多相关文章

  1. zabbix监控ssl证书过期时间

    获取证书过期时间脚本: /etc/zabbix/scripts/check-cert-expire.sh: #!/bin/bash host=$ port=$ end_date=`/usr/bin/o ...

  2. Splunk < 6.3 版本 SSL 证书过期事宜

    最近Splunk发出邮件提醒客户SSL证书过期事宜. 问题看起来比较严重,因为所有的实例,包括 forwarder\peernode\indexer\master node 等等都受影响,而且Depl ...

  3. ssl证书过期问题

    问题:linux服务器ssl证书过期,申请新证书后,也更换了服务器的证书,但是网页一直提示证书过期 解决:经分析后,发现服务器架构为waf->slb->esc,域名并未直接解析到slb,解 ...

  4. 阿里云ssl证书过期怎么解决 (免费SSL证书) 三步解决

    阿里云ssl证书过期怎么解决(免费SSL证书),三步解决 使用免费的SSL证书网站  https://ohttps.com 1.注册帐号 2.申请证书 3.部署到阿里云 4.注意事项 1.注册帐号 到 ...

  5. ssl证书过期问题解决

    1,ssl证书失效现象 小程序debug有如下证书无效信息: 浏览器访问https://ic-park.net:30001/indoornav/callFunction1.php 提示证书风险. 2, ...

  6. webSphere提示SSL证书过期,解决方法

    1.点击Security ------SSL certificate and key management2.点击Related Items下的key stores and certificates3 ...

  7. 使用nagios监控ssl证书过期时间

    1.编写监控脚本. # vim check_ssl_expiry.sh #!/bin/bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 Host=$1 ...

  8. 一键git push脚本(python版)

    #!/usr/bin/env python import os import subprocess import sys import time gitconfig = { 'cwd': './blo ...

  9. 002_监测ssl证书过期时间

    一. s_client This implements a generic SSL/TLS client which can establish a transparent connection to ...

  10. [linux tips] puppet client ssl 证书过期

    问题: [root@control-01 .ssh]# puppet agent -tv Warning: Unable to fetch my node definition, but the ag ...

随机推荐

  1. MQTT-保留消息和遗嘱消息

    保留消息 为什么需要保留消息 ​ 如果不考虑持久会话的因素,那么MQTT订阅只有在客户端连接之后才能创建,所以服务端不能提前预知某个主题会被哪些服务端订阅或者某个客户端会订阅哪些主题,所以当消息到达服 ...

  2. Vue中使用原生js实现轮播图滑动效果

    1.在视图层模板里面绑定touchstart和touchend事件 <div class="tuWap" @touchstart="touchStart" ...

  3. 2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

    2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值. 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109 ...

  4. 2021-01-10:linux中,我要看某一个进程的并发,通过什么命令去查?

    福哥答案2021-01-10:[答案来自此链接:](https://blog.csdn.net/sinat_31275315/article/details/108239492)方法一:PS在ps命令 ...

  5. 2021-05-09:给定数组hard和money,长度都为N;hard[i]表示i号的难度, money[i]表示i号工作的收入;给定数组ability,长度都为M,ability[j]表示j号人的

    2021-05-09:给定数组hard和money,长度都为N:hard[i]表示i号的难度, money[i]表示i号工作的收入:给定数组ability,长度都为M,ability[j]表示j号人的 ...

  6. 2021-12-09:二叉树展开为链表。 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左

    2021-12-09:二叉树展开为链表. 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左 ...

  7. Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo

    前言   在arm上做了Qt的应用程序,为了在局域网实现web页的访问方式来配置arm上Qt的程序,局域网轻量级http服务器是很好的实现方式之一,有机会做国产麒麟上Qt的http服务器,正好接触到了 ...

  8. ACM,我“退役”了

    ACM,我"退役"了 凡是过往 皆为序章. 就在昨天,我把我所有的装备都拿回了宿舍,实验室中我的工位变得干干净净.走出实验室时,我和老唐都有些难受,毕竟,我们这样就"退役 ...

  9. 【VS Code 与 Qt6】QCheckBox的图标为什么不会切换?

    本篇专门扯一下有关 QCheckBox 组件的一个问题.老周不水字数,直接上程序,你看了就明白. #include <QApplication> #include <QWidget& ...

  10. 资源高效搜索方法,你 Get 到了吗?

      随手转发给好友和朋友圈  编辑:办公小通 百度搜索谁都会,但是搜出来的资料往往良莠不齐.搜索速度是快了,但是还要花大量的时间去筛选. 通过下面的两个最常用的栗子,小通强烈推荐大家用高级搜索. 高级 ...