SSL 证书过期巡检脚本 (Python 版)
哈喽大家好,我是咸鱼
之前写了个 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 版)的更多相关文章
- zabbix监控ssl证书过期时间
获取证书过期时间脚本: /etc/zabbix/scripts/check-cert-expire.sh: #!/bin/bash host=$ port=$ end_date=`/usr/bin/o ...
- Splunk < 6.3 版本 SSL 证书过期事宜
最近Splunk发出邮件提醒客户SSL证书过期事宜. 问题看起来比较严重,因为所有的实例,包括 forwarder\peernode\indexer\master node 等等都受影响,而且Depl ...
- ssl证书过期问题
问题:linux服务器ssl证书过期,申请新证书后,也更换了服务器的证书,但是网页一直提示证书过期 解决:经分析后,发现服务器架构为waf->slb->esc,域名并未直接解析到slb,解 ...
- 阿里云ssl证书过期怎么解决 (免费SSL证书) 三步解决
阿里云ssl证书过期怎么解决(免费SSL证书),三步解决 使用免费的SSL证书网站 https://ohttps.com 1.注册帐号 2.申请证书 3.部署到阿里云 4.注意事项 1.注册帐号 到 ...
- ssl证书过期问题解决
1,ssl证书失效现象 小程序debug有如下证书无效信息: 浏览器访问https://ic-park.net:30001/indoornav/callFunction1.php 提示证书风险. 2, ...
- webSphere提示SSL证书过期,解决方法
1.点击Security ------SSL certificate and key management2.点击Related Items下的key stores and certificates3 ...
- 使用nagios监控ssl证书过期时间
1.编写监控脚本. # vim check_ssl_expiry.sh #!/bin/bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 Host=$1 ...
- 一键git push脚本(python版)
#!/usr/bin/env python import os import subprocess import sys import time gitconfig = { 'cwd': './blo ...
- 002_监测ssl证书过期时间
一. s_client This implements a generic SSL/TLS client which can establish a transparent connection to ...
- [linux tips] puppet client ssl 证书过期
问题: [root@control-01 .ssh]# puppet agent -tv Warning: Unable to fetch my node definition, but the ag ...
随机推荐
- C++ Primer 5th 阅读笔记:入门指南
学习方法 The way to learn a new programming language is to write programs. 学习一门新编程语言的方式是编写程序. 函数(Functio ...
- 麻了,一个操作把MySQL主从复制整崩了
前言 最近公司某项目上反馈mysql主从复制失败,被运维部门记了一次大过,影响到了项目的验收推进,那么究竟是什么原因导致的呢?而主从复制的原理又是什么呢?本文就对排查分析的过程做一个记录. 主从复制原 ...
- 2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限
2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"], ...
- 2020-10-30:给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?
福哥答案2020-10-30:1.双重遍历法.2.一次遍历法.golang代码如下: package main import "fmt" const INT_MAX = int(^ ...
- 2020-01-25:redis中,哨兵如何选举?
福哥答案2020-01-25: [答案1:](https://bbs.csdn.net/topics/398982967)redis-sentinel故障转移的流程:1.当多个sentinel发现并确 ...
- simplejwt配置大全
# simplejwt配置大全SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # 设置token有效时间 'REFRESH_ ...
- Django-4:运行runserver
Djnago运行.启动 命令:python manage.py runserver 端口号 例如:当前有个项目为ClosedLoop,如果要启动它就进入项目环境,或者直接在PyCharm的终端中运行命 ...
- 防抖节流utils
/** * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数 * * @param {Function} func 要执行的回调函数 * @param {Number} wait ...
- Kali安装GVM
1.安装gvm ┌──(rootkali)-[/home/kali] └─# gvm-setup 1 ⨯ [>] Starting PostgreSQL service [-] ERROR: T ...
- AI 协助办公 |记一次用 GPT-4 写一个消息同步 App
GPT-4 最近风头正劲,作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐.恰好,现在有一个将 Slack channel 消息同步到其他 IM 的需求,看看 GPT-4 能不能帮我完 ...