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

liftword2周前 (12-16)技术文章19


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

想要使用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 编程的“时间魔术”:掌握日期与时间的20+妙招

在Python中,管理时间和日期可能是我们经常面对的一项任务,而datetime模块正是帮我们处理这些问题的利器。datetime模块不仅让我们轻松搞定时间和日期的转换、操作,还能帮助我们应对日常工作...

Python中的日期和时间处理 python处理日期数据

在Python编程语言中,日期和时间的处理是一项常见且重要的任务。Python提供了一个强大的内置模块datetime,它允许我们以多种方式操作日期和时间。本文将通过一系列示例,深入探讨如何在Pyth...

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计算程序运行时间—time.time()、time.clock()

我们先来看一下python3中help(time):关于time库中表示时间的方法,官方给出了2种:1.从1970-01-01 00:00:00 UTC,开始到现在所经历的时间,以浮点数的'秒...

让时间变得简单易用:深入了解 Python 的 dateutil 库

在 Python 编程的世界里,处理日期和时间的数据是一个常见却复杂的任务。谁不想让这一过程更加简单呢?今天,我们要聊的就是一个超级实用的库——dateutil。它能帮助你轻松应对各种与时间相关的问题...

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

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