哈嘍大家好,我是咸魚(yú)
之前寫(xiě)了個(gè) shell 版本的 SSL 證書(shū)過(guò)期巡檢腳本 (文章:《SSL 證書(shū)過(guò)期巡檢腳本》),后臺(tái)反響還是很不錯(cuò)的
那么今天咸魚(yú)給大家介紹一下 python 版本的 SSL 證書(shū)過(guò)期巡檢腳本 (完整代碼在文末)
思路
導(dǎo)入相關(guān)模塊
import ssl
import socket
import time
from datetime import datetime
首先我們創(chuàng)建一個(gè) domain.txt
用來(lái)存放要檢查的域名和對(duì)應(yīng)的 IP 地址
www.baidu.com:180.101.50.242,180.101.50.188
www.bing.com:202.89.233.101,202.89.233.100
我們讀取該文件,把里面的域名和對(duì)應(yīng)的每個(gè) ip 取出來(lái),并存放到字典 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(',')
取出來(lái)之后我們循環(huán)遍歷字典,去獲取每個(gè)域名對(duì)應(yīng)的證書(shū)信息(ssl_connect
函數(shù))
def ssl_connect(domain, ip):
# 設(shè)置socket的超時(shí)時(shí)間為5秒
socket.setdefaulttimeout(5)
# 創(chuàng)建默認(rèn)的SSL上下文
context = ssl.create_default_context()
# 創(chuàng)建一個(gè)SSL套接字
skt = context.wrap_socket(socket.socket(), server_hostname=domain)
try:
# 建立SSL連接
skt.connect((ip, 443))
# 獲取證書(shū)過(guò)期時(shí)間
end_date = skt.getpeercert()['notAfter'].strip(' GMT')
# 創(chuàng)建一個(gè)字典,存儲(chǔ)本次連接中的域名、IP 地址和證書(shū)過(guò)期時(shí)間信息
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:
# 關(guān)閉SSL套接字
skt.close()
return skt_info
ssl_connect
函數(shù)返回一個(gè)字典 skt_info
,包含當(dāng)前連接的域名、ip 地址和證書(shū)過(guò)期時(shí)間
# skt_info 內(nèi)容
{'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'}
然后我們調(diào)用 check_cert_time
函數(shù)進(jìn)行證書(shū)有效期檢查和提示
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
函數(shù)內(nèi)容如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-623618.html
def check_cert_time(info):
# 獲取當(dāng)前時(shí)間戳
current_timestamp = int(time.time())
# 將證書(shū)過(guò)期時(shí)間轉(zhuǎn)換成時(shí)間戳
date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y")
end_timestamp = int(date_object.timestamp())
# 計(jì)算剩余天數(shù)
remain_day = (end_timestamp - current_timestamp) / 86400
# 打印域名、IP 地址和證書(shū)過(guò)期時(shí)間信息
print(f"域名:{info['domain']},ip 地址:{info['ip']},證書(shū)過(guò)期時(shí)間:{info['end_date']}")
# 根據(jù)剩余天數(shù)進(jìn)行不同的提示
# 如果證書(shū)過(guò)期時(shí)間減去當(dāng)前時(shí)間的天數(shù)小于七天的話,則提示需要準(zhǔn)備更換證書(shū)了
if 0 < remain_day < 7:
print('剩余時(shí)間小于七天!請(qǐng)及時(shí)更換證書(shū)!')
elif remain_day < 0:
print('證書(shū)已過(guò)期!請(qǐng)及時(shí)更換證書(shū)!')
else:
print(f"剩余天數(shù)為:{remain_day:.2f}天\n")
最后我們執(zhí)行一下代碼,看看結(jié)果如何文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-623618.html
完整代碼
import ssl
import socket
import time
from datetime import datetime
def ssl_connect(domain, ip):
# 設(shè)置socket的超時(shí)時(shí)間為5秒
socket.setdefaulttimeout(5)
# 創(chuàng)建默認(rèn)的SSL上下文
context = ssl.create_default_context()
# 創(chuàng)建一個(gè)SSL套接字
skt = context.wrap_socket(socket.socket(), server_hostname=domain)
try:
# 建立SSL連接
skt.connect((ip, 443))
# 獲取證書(shū)過(guò)期時(shí)間
end_date = skt.getpeercert()['notAfter'].strip(' GMT')
# 創(chuàng)建一個(gè)字典,存儲(chǔ)本次連接中的域名、IP 地址和證書(shū)過(guò)期時(shí)間信息
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:
# 關(guān)閉SSL套接字
skt.close()
return skt_info
def check_cert_time(info):
# 獲取當(dāng)前時(shí)間戳
current_timestamp = int(time.time())
# 將證書(shū)過(guò)期時(shí)間轉(zhuǎn)換成時(shí)間戳
date_object = datetime.strptime(info['end_date'], "%b %d %H:%M:%S %Y")
end_timestamp = int(date_object.timestamp())
# 計(jì)算剩余天數(shù)
remain_day = (end_timestamp - current_timestamp) / 86400
# 打印域名、IP 地址和證書(shū)過(guò)期時(shí)間信息
print(f"域名:{info['domain']},ip 地址:{info['ip']},證書(shū)過(guò)期時(shí)間:{info['end_date']}")
# 根據(jù)剩余天數(shù)進(jìn)行不同的提示
# 如果證書(shū)過(guò)期時(shí)間減去當(dāng)前時(shí)間的天數(shù)小于七天的話,則提示需要準(zhǔn)備更換證書(shū)了
if 0 < remain_day < 7:
print('剩余時(shí)間小于七天!請(qǐng)及時(shí)更換證書(shū)!')
elif remain_day < 0:
print('證書(shū)已過(guò)期!請(qǐng)及時(shí)更換證書(shū)!')
else:
print(f"剩余天數(shù)為:{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]
到了這里,關(guān)于SSL 證書(shū)過(guò)期巡檢腳本 (Python 版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!