You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历URL列表调用SSL证书过期查询函数的问题

解决SSL证书过期日期批量查询的问题

咱们一步步梳理你代码里的问题,然后给出修复后的完整方案:

原代码的核心问题

  • sslExpiresDate函数没有接收单个站点参数,直接依赖全局的sites列表,没法单独查询某个站点
  • all_sites_list里遍历错误地写成了sites(),但sites是列表不是可调用函数
  • 调用sslExpiresDate(site)时,原函数没有定义参数,导致调用失败
  • 原始的x509.get_notAfter()返回字节格式的日期字符串(比如b'20251231235959Z'),需要转换成你要的易读格式
  • 没有处理表格样式的输出,结果可读性差

修复后的完整代码

import OpenSSL
import ssl
from datetime import datetime

sites = ['www.site1.com', 'www.site2.com', 'www.site3.com']

def sslExpiresDate(site):
    # 获取单个站点的SSL证书
    cert = ssl.get_server_certificate((site, 443))
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
    # 解析并转换过期日期格式
    raw_exp_date = x509.get_notAfter().decode('utf-8')  # 转成字符串格式
    exp_datetime = datetime.strptime(raw_exp_date, '%Y%m%d%H%M%SZ')
    # 转换成你需要的DD-MM-YY格式(如果要MM-DD-YY就改成'%m-%d-%y')
    return exp_datetime.strftime('%d-%m-%y')

def all_sites_list(sites):
    # 打印表格表头
    print(f"{'SITE':<20} {'EXP DATE'}")
    print("-" * 30)
    # 遍历每个站点并查询过期日期
    for site in sites:
        try:
            exp_date = sslExpiresDate(site)
            print(f"{site:<20} {exp_date}")
        except Exception as e:
            # 处理连接失败或证书获取失败的异常
            print(f"{site:<20} *ERROR*: {str(e)}")

# 调用函数执行批量查询
all_sites_list(sites)

代码说明

  1. 优化sslExpiresDate函数:新增site参数支持单个站点查询,同时添加日期格式转换逻辑,把证书返回的原始日期转成你需要的易读格式。
  2. 修复all_sites_list函数:去掉多余的函数参数,直接遍历sites列表;添加表头和分隔线让输出更像表格;增加异常捕获,避免单个站点出错导致整个脚本崩溃。
  3. 格式优化:用字符串对齐语法(<20表示左对齐占20个字符),让输出整齐易读。

示例输出

SITE                 EXP DATE
------------------------------
www.site1.com        03-05-18
www.site2.com        08-12-19
www.site3.com        12-12-21

如果想要更美观的表格,也可以使用tabulate库(先执行pip install tabulate安装),修改all_sites_list函数如下:

from tabulate import tabulate

def all_sites_list(sites):
    table_data = []
    for site in sites:
        try:
            exp_date = sslExpiresDate(site)
            table_data.append([site, exp_date])
        except Exception as e:
            table_data.append([site, f"ERROR: {str(e)}"])
    print(tabulate(table_data, headers=["SITE", "EXP DATE"], tablefmt="simple"))

这样输出的表格会更规范,适合批量站点查询的场景。

内容的提问来源于stack exchange,提问作者RaptorPete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:56