Python获取网站的SSL证书到期时间

liftword5个月前 (12-16)技术文章74


了解证书的剩余有效期,可以在证书即将到期时自动发送警告通知。告诉管理运营人员进行续订或更新,避免服务中断。

想要使用Python获取网站的ssl证书到期时间,我们可以使用ssl模块和socket库。

提示

  • 准备将要检测的域名
  • 通过使用ssl模块和socket库获取到对端的证书信息,并解析证书中的到期时间
  • 通知处理:例如发邮件,发短信等,测试脚本我们用tabulate打印输出。
# -*- coding: UTF-8 -*-

"""
获取一个网站HTTPS证书的到期时间和剩余天数。
    pytz: 处理时区转换
    tabulate: 打印漂亮表格
"""

import socket
import ssl
from datetime import datetime
import pytz
from tabulate import tabulate


def get_certificate_info(host='', port=443):
    """
    获取指定主机HTTPS证书的信息。

    参数:
    host (str): 主机名或IP地址,默认为 ''。
    port (int): 端口,默认为 443。

    返回:
    dict: 包含证书到期时间和剩余天数的信息字典。
    """
    try:
        # 创建默认的SSL上下文
        context = ssl.create_default_context()
        # 基于默认上下文和AF_INET地址族创建一个安全的socket连接
        conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=host)
        # 连接到指定的主机和端口
        conn.connect((host, port))

        # 获取对端的证书信息
        cert = conn.getpeercert()
        # 尝试解析证书的过期时间
        try:
            not_after = datetime.strptime(cert['notAfter'], "%b %d %H:%M:%S %Y %Z")
        except Exception as e:
            # 如果证书的过期时间格式无法识别,则返回错误信息
            return {
                'expiry_time': "无法识别的日期格式" + e.__str__(),
                'days_remaining': "未知"
            }

        # 创建UTC时区对象
        utc_tz = pytz.utc

        # 将证书的到期时间设置为UTC时间
        not_after_utc = utc_tz.localize(not_after)

        # 创建北京时间时区对象
        beijing_tz = pytz.timezone('Asia/Shanghai')

        # 将UTC时间转换为北京时间
        not_after_bj = not_after_utc.astimezone(beijing_tz)

        # 计算剩余天数
        days_remaining = (not_after_bj - datetime.now(beijing_tz)).days

        return {
            'expiry_time': not_after_bj.strftime('%Y-%m-%d %H:%M:%S'),
            'days_remaining': days_remaining
        }
    except Exception as e:
        return {
            'expiry_time': str(e),
            'days_remaining': "未知"
        }


if __name__ == '__main__':

    # 定义一个包含多个域名的列表
    hostname_list = [
        "www.qq.com",
        "www.baidu.com",
        "www.sohu.com",
        "www.xiaomi.com",
        # 故意给个未知域名
        "www.weizhiyuming.com",
    ]

    # 初始化一个列表,用于存储主机名及其证书到期时间的相关信息
    hostname_list_result = [
        ["检测域名", "到期时间", "剩余天数"]
    ]

    # 遍历主机名列表,获取每个主机的证书信息
    for hostname in hostname_list:
        # 获取当前主机的证书信息
        cert_info = get_certificate_info(hostname)
        # 构建包含主机名、证书到期时间、剩余天数的列表
        cert_info_result = [
            hostname, cert_info['expiry_time'], cert_info['days_remaining'],
        ]
        # 将当前主机的证书信息列表添加到结果列表中
        hostname_list_result.append(cert_info_result)

    print(tabulate(hostname_list_result, tablefmt="grid", numalign="center"))


相关文章

python内置时间函数time详解 python time 函数

内置函数时间time()1、年:tm_year, 月:tm_mon, 日:tm_mday,时:tm_hour, 分:tm_min, 秒:tm_sec, 星期:tm_wday(从0开始)2、Time.t...

python字符串\数值型变量转换日期格式

在程序设计中经常会遇到字符串向日期格式转换的问题,有一种直接有效的办法。最终得到的date变量即是date格式,不显示时间(00:00:00)。import datetime ####### 导入da...

十二、Python 日期时间datetime模块详细使用

1、datetime模块:日期包含年、月、日、小时、分钟、秒和微秒。datetime 模块有许多方法可以返回有关日期对象的信息。一般操作就是获取时间是哪年哪月什么时间端,处于那个时区范围,几个操作时间...

Python中的datetime模块:日期和时间的计算

Python 中的 datetime 模块是一个用于处理日期和时间的标准库。它提供了各种功能,包括日期和时间的表示、格式化、解析、计算等。日期和时间对象:datetime 模块中最常用的类是 date...

了解何时使用函数以及何时在 Python 中选择类

Python 以其简单性和灵活性而闻名,它提供了多种构建代码的方法,其中函数和类是开发人员工具包中最常见的两种工具。函数和类在 Python 编程中都有其位置,但知道何时使用一个而不是另一个是编写高...