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

脚本 ,SSL ,Python ,证书 · 浏览次数 : 367

小编点评

**思路** 1. **导入相关模块**: - `sslimport` 用于操作 SSL 证书。 - `socketimport` 用于操作 socket。 - `timefromdatetime` 用于处理时间。 2. **创建域名列表**: - 从 `domain.txt` 文件中读取域名和 IP 地址。 - 创建一个 `domains` 字典,用于存储每个域名对应的证书信息。 3. **循环遍历域名**: - 遍历 `domains` 字典中的所有域名。 - 对于每个域名,执行 `ssl_connect` 函数获取证书信息。 4. **调用 `check_cert_time` 函数进行证书有效期检查**: - 从每个证书信息中获取证书过期时间。 - 使用 `check_cert_time` 函数计算剩余天数。 - 根据剩余天数提示用户更换证书。 5. **打印证书有效期信息**: - 遍历 `domains` 字典,打印域名、IP 地址和证书有效期信息。 - 根据剩余天数,显示证书有效期的提示信息。 6. **执行代码**: - 运行代码,将域名和 IP 地址输入 `ssl_connect` 函数中。 - 运行 `check_cert_time` 函数,处理证书有效期。 **完整代码** ```python import sslimport import timefromdatetime def ssl_connect(domain, ip): # 设置 socket 的超时时间 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') # 创建证书有效期字典 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() 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 # 打印证书有效期信息 print(f'域名:{info["domain"]}, ip 地址:{info["ip"]}, 证书有效期:{info["end_date"]}') # 获取域名和 IP 地址 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] ```

正文

哈喽大家好,我是咸鱼

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

最后我们执行一下代码,看看结果如何
image

完整代码

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 版)相似的内容:

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

哈喽大家好,我是咸鱼 之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《[SSL 证书过期巡检脚本](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247486153&idx=1&sn=52911a79b77c11d7

SSL 证书过期巡检脚本

哈喽大家好,我是咸鱼 我们知道 SSL 证书是会过期的,一旦过期之后需要重新申请。如果没有及时更换证书的话,就有可能导致网站出问题,给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期 如果公司业务体量较大的话,肯定不止一个域名,而一个域名后面又会对应着多台机器,如

Cert Manager 申请 SSL 证书流程及相关概念 - 一

2022.3.9 用 cert-manager 申请成功通配符证书 (*.ewhisper.cn), 2022.4.30 该证书距离过期还有 30 天,cert-manager 进行自动续期,但是却失败了。😱😱😱 然后过了几天,在 2022.5.8, 最终成功了。如下图: 正好借着这个情况捋一

Cert Manager 申请SSL证书流程及相关概念-二

近期用 cert-manager 申请的通配符证书续期失败了,然后过了几天又成功了。正好借着这个情况捋一下 cert-manager 的 SSL证书申请流程以及过程中涉及到的相关概念。

FreeSSL申请免费证书

FreeSSL申请免费证书 FreeSSL 是一个免费证书和 SSL 证书管理平台。旨在为个人和小型企业提供免费 SSL 证书,以加强他们的网站和应用程序的安全性。与传统的 SSL 证书颁发机构不同,FreeSSL 使用自动化过程生成 SSL 证书,并提供一个管理面板,让用户可以轻松管理他们的证书和

[转帖]SpringBoot配置SSL 坑点总结【密码验证失败、连接不安全】

文章目录 前言1.证书绑定问题2.证书和密码不匹配3.yaml配置文件问题3.1 解密类型和证书类型是相关的3.2 配置文件参数混淆 后记 前言 在SpringBoot服务中配置ssl,无非就是下载证书设置一下配置文件的问题,这里主要记录我在配置的过程中遇到的坑点。 如果是新手上道的话建议结合其他的

架构与思维:了解Http 和 Https的区别(图文详解)

1 介绍 随着 HTTPS 的不断普及和使用成本的下降,现阶段大部分的系统都已经开始用上 HTTPS 协议。 HTTPS 与 HTTP 相比, 主打的就是安全概念,相关的知识如 SSL 、非对称加密、 CA证书、数据完整性保护 等,我们多多少少也都有听过。 本文重点从原理上讲解 HTTPS 的安全性

[转帖]SSL数字证书分类DV/OV/EV

SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书、OV证书、EV证书。 1.1.DV证书(域名证书) DV(Domain Validated)证书是最常见的一种证书类型,大多数免费证书都此类证书。CA机构获取CSR证书请求后,从

Nginx SSL证书更新及密码套件更新

一、域名更换证书 ssl证书一般包括证书文件crt、cer、pem、pfx和私钥文件key。 CER、CRT、PEM 和 PFX 是不同的证书文件格式,它们之间存在一些区别: CER (DER 编码) CER 文件是使用 DER 编码的证书文件格式。 CER 文件通常包含单个 X.509 证书。 C

[转帖]何为SSL证书以及SSL证书的类型都有哪些

http://www.tuidc.com/helpinfo/28573.html 简述: 什么是SSL证书呢?我们都知道目前互联网安全威胁愈演愈烈,各类入侵、劫持事件层出不穷,欺诈、钓鱼网站比比皆是。https加密传输方案在传输层可有效防止他人截获,同时客户端浏 什么是SSL证书呢?我们都知道目前互