最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)檢測SSL證書是否過期

 更新時間:2023年08月04日 10:25:29   作者:咸魚Linux運(yùn)維  
我們知道 SSL 證書是會過期的,一旦過期之后需要重新申請,如果沒有及時更換證書的話,就有可能導(dǎo)致網(wǎng)站出問題,所以本文介紹了如何利用Python實(shí)現(xiàn)檢測SSL證書是否過期,需要的可以參考下

之前寫了個 shell 版本的 SSL 證書過期巡檢腳本 (文章:《SSL 證書過期巡檢腳本》),后臺反響還是很不錯的

那么今天咸魚給大家介紹一下 python 版本的 SSL 證書過期巡檢腳本 (完整代碼在文末)

思路

導(dǎo)入相關(guān)模塊

import ssl
import socket
import time
from datetime import datetime

首先我們創(chuàng)建一個 domain.txt 用來存放要檢查的域名和對應(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

我們讀取該文件,把里面的域名和對應(yīng)的每個 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(',')

取出來之后我們循環(huán)遍歷字典,去獲取每個域名對應(yīng)的證書信息(ssl_connect 函數(shù))

def ssl_connect(domain, ip):
    # 設(shè)置socket的超時時間為5秒
    socket.setdefaulttimeout(5)
    # 創(chuàng)建默認(rèn)的SSL上下文
    context = ssl.create_default_context()
    # 創(chuàng)建一個SSL套接字
    skt = context.wrap_socket(socket.socket(), server_hostname=domain)
    try:
        # 建立SSL連接
        skt.connect((ip, 443))
        # 獲取證書過期時間
        end_date = skt.getpeercert()['notAfter'].strip(' GMT')
        # 創(chuàng)建一個字典,存儲本次連接中的域名、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:
        # 關(guān)閉SSL套接字
        skt.close()
    return skt_info

ssl_connect 函數(shù)返回一個字典 skt_info,包含當(dāng)前連接的域名、ip 地址和證書過期時間

# 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)行證書有效期檢查和提示

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)容如下:

def check_cert_time(info):
    # 獲取當(dāng)前時間戳
    current_timestamp = int(time.time())
    # 將證書過期時間轉(zhuǎn)換成時間戳
    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 地址和證書過期時間信息
    print(f"域名:{info['domain']},ip 地址:{info['ip']},證書過期時間:{info['end_date']}")
    # 根據(jù)剩余天數(shù)進(jìn)行不同的提示
    # 如果證書過期時間減去當(dāng)前時間的天數(shù)小于七天的話,則提示需要準(zhǔn)備更換證書了
    if 0 < remain_day < 7:
        print('剩余時間小于七天!請及時更換證書!')
    elif remain_day < 0:
        print('證書已過期!請及時更換證書!')
    else:
        print(f"剩余天數(shù)為:{remain_day:.2f}天\n")

最后我們執(zhí)行一下代碼,看看結(jié)果如何

完整代碼

import ssl
import socket
import time
from datetime import datetime
def ssl_connect(domain, ip):
    # 設(shè)置socket的超時時間為5秒
    socket.setdefaulttimeout(5)
    # 創(chuàng)建默認(rèn)的SSL上下文
    context = ssl.create_default_context()
    # 創(chuàng)建一個SSL套接字
    skt = context.wrap_socket(socket.socket(), server_hostname=domain)
    try:
        # 建立SSL連接
        skt.connect((ip, 443))
        # 獲取證書過期時間
        end_date = skt.getpeercert()['notAfter'].strip(' GMT')
        # 創(chuàng)建一個字典,存儲本次連接中的域名、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:
        # 關(guān)閉SSL套接字
        skt.close()
    return skt_info
def check_cert_time(info):
    # 獲取當(dāng)前時間戳
    current_timestamp = int(time.time())
    # 將證書過期時間轉(zhuǎn)換成時間戳
    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 地址和證書過期時間信息
    print(f"域名:{info['domain']},ip 地址:{info['ip']},證書過期時間:{info['end_date']}")
    # 根據(jù)剩余天數(shù)進(jìn)行不同的提示
    # 如果證書過期時間減去當(dāng)前時間的天數(shù)小于七天的話,則提示需要準(zhǔn)備更換證書了
    if 0 < remain_day < 7:
        print('剩余時間小于七天!請及時更換證書!')
    elif remain_day < 0:
        print('證書已過期!請及時更換證書!')
    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)于Python實(shí)現(xiàn)檢測SSL證書是否過期的文章就介紹到這了,更多相關(guān)Python檢測SSL是否過期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中SyntaxError的常見場景和修正指南

    Python中SyntaxError的常見場景和修正指南

    在Python編程中,語法錯誤(SyntaxError)是最基礎(chǔ)的異常類型之一,它發(fā)生在代碼違反Python語法規(guī)則時,本文將系統(tǒng)梳理Python中常見的SyntaxError場景,結(jié)合典型案例與修正策略,幫助開發(fā)者快速定位并修復(fù)語法問題,需要的朋友可以參考下
    2025-12-12
  • Python隨機(jī)數(shù)種子(random seed)的使用

    Python隨機(jī)數(shù)種子(random seed)的使用

    在科學(xué)技術(shù)和機(jī)器學(xué)習(xí)等其他算法相關(guān)任務(wù)中,我們經(jīng)常需要用到隨機(jī)數(shù),本文就詳細(xì)的介紹一下Python隨機(jī)數(shù)種子,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python df遍歷的N種方式(小結(jié))

    python df遍歷的N種方式(小結(jié))

    本文主要介紹了python df遍歷的N種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 小學(xué)生必須掌握的Python語法與代碼示例

    小學(xué)生必須掌握的Python語法與代碼示例

    學(xué)習(xí)Python從入門到精通,關(guān)鍵在于先建立扎實(shí)的核心概念(如基礎(chǔ)語法、函數(shù)、面向?qū)ο螅?再系統(tǒng)掌握其高級特性和生態(tài)工具,下面我為你規(guī)劃了一條清晰的學(xué)習(xí)路徑,并提供了核心知識框架和示例,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • python不使用for計(jì)算兩組、多個矩形兩兩間的iou方式

    python不使用for計(jì)算兩組、多個矩形兩兩間的iou方式

    今天小編就為大家分享一篇python不使用for計(jì)算兩組、多個矩形兩兩間的iou方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • PyCharm配置mongo插件的方法

    PyCharm配置mongo插件的方法

    今天小編就為大家分享一篇PyCharm配置mongo插件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 對python中return和print的一些理解

    對python中return和print的一些理解

    最近看到視頻中講到python中的print和return的區(qū)別,感到一些迷惑,所以自己上手實(shí)踐了一把,下面這篇文章主要給大家介紹了關(guān)于對python中return和print的一些理解,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Python列表推導(dǎo)式詳解

    Python列表推導(dǎo)式詳解

    列表推導(dǎo)式是Python構(gòu)建列表(list)的一種快捷方式,可以使用簡潔的代碼就創(chuàng)建出一個列表.本文通過代碼示例詳細(xì)介紹了python列表推導(dǎo)式,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • pd.drop_duplicates刪除重復(fù)行的方法實(shí)現(xiàn)

    pd.drop_duplicates刪除重復(fù)行的方法實(shí)現(xiàn)

    drop_duplicates 方法實(shí)現(xiàn)對數(shù)據(jù)框 DataFrame 去除特定列的重復(fù)行,本文主要介紹了pd.drop_duplicates刪除重復(fù)行的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Python+Pygame實(shí)現(xiàn)神廟逃亡游戲

    Python+Pygame實(shí)現(xiàn)神廟逃亡游戲

    這篇文章主要為大家介紹了如何利用Python和Pygame動畫制作一個神廟逃亡類似的小游戲。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下
    2022-05-05

最新評論

稻城县| 晴隆县| 栾城县| 平山县| 土默特左旗| 石柱| 景德镇市| 连山| 洞口县| 台南县| 荣成市| 民县| 全州县| 温宿县| 丽水市| 平果县| 张家川| 桃江县| 新丰县| 甘洛县| 辽源市| 合川市| 克什克腾旗| 沁阳市| 瑞安市| 沙田区| 武汉市| 茂名市| 新民市| 保康县| 临邑县| 鄂伦春自治旗| 孟村| 林周县| 酉阳| 乡宁县| 得荣县| 沙坪坝区| 准格尔旗| 铁岭县| 阿克苏市|