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)
代码说明
- 优化
sslExpiresDate函数:新增site参数支持单个站点查询,同时添加日期格式转换逻辑,把证书返回的原始日期转成你需要的易读格式。 - 修复
all_sites_list函数:去掉多余的函数参数,直接遍历sites列表;添加表头和分隔线让输出更像表格;增加异常捕获,避免单个站点出错导致整个脚本崩溃。 - 格式优化:用字符串对齐语法(
<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
相关产品推荐
相关产品推荐

