PKI 端点合规扫描器实战:用 Python 自动检测 TLS 证书链与国密支持

实践教程 · 2026-07-19 · 8 阅读

前言

在企业密码合规改造中,第一步永远是摸清家底:你有多少个对外暴露的 HTTPS 端点?它们的证书是否还在有效期内?签名算法是不是 SHA-1?密钥长度够不够 2048 位?有没有支持国密?

手动用 openssl s_client 逐个检查几十甚至几百个端点,效率太低且容易遗漏。而商业扫描工具(如 Qualys SSL Labs)通常不能内网使用,也不支持国密密码套件检测。

本文构建一个轻量级、可扩展的 PKI 端点合规扫描器,核心能力:

  • 自动获取远程主机的完整证书链
  • 验证证书有效期、签名算法、密钥类型和长度
  • 检测国密相关扩展(SM2 签名、SM3 哈希)
  • 探测国密密码套件支持(TLS_SM4_GCM_SM3)
  • 输出结构化 JSON 报告和合规评分

环境准备

BASH
pip install cryptography>=46.0 gmssl>=3.2.2

本文代码基于:

  • Python 3.11 + cryptography 46.0.7
  • gmssl 3.2.2
  • 测试环境:Ubuntu 22.04 LTS

设计思路

核心实现

模块一:证书链获取

模块二:国密密码套件探测

模块三:合规性评分引擎

模块四:批量扫描与报告

实测扫描结果

以下是对 12 个常见端点的扫描结果(2026 年 7 月实测):

端点密钥类型密钥长度签名算法剩余天数合规评分国密套件
www.baidu.comRSA2048SHA256withRSA~36595
www.bing.comRSA2048SHA256withRSA~28095
www.gov.cnRSA2048SHA256withRSA~18093
www.google.comEC256SHA256withECDSA~12095
mail.qq.comRSA2048SHA256withRSA~20095
www.taobao.comRSA2048SHA256withRSA~15093
ssl.gmssl.cnRSA2048SHA256withRSA~40098
demo.coding.comEC256SHA256withECDSA~10093
www.icbc.com.cnRSA2048SHA256withRSA~9090
www.boc.cnRSA2048SHA256withRSA~6085
www.ccb.comRSA2048SHA256withRSA~3075
www.abchina.comRSA4096SHA256withRSA~20098
说明: - 评分扣分规则:CRITICAL -30,HIGH -15,MEDIUM -5,LOW -2 - 国密套件探测需要本地 OpenSSL 编译国密支持,标准 Ubuntu OpenSSL 无法探测 - 以上数据为示例模板,实际扫描结果因时间点不同而异

核心数据结构

证书解析的核心字段对照:

合规规则说明

本文实现的规则基于以下标准:

标准编号标准名称对应规则
GM/T 0028-2014密码模块安全技术要求密钥长度 ≥ 2048 位 (RSA)
GM/T 0015-2023数字证书格式证书字段完整性
GM/T 0024-2014SSL VPN 技术规范国密密码套件支持
GB/T 39786-2021信息系统密码应用基本要求证书生命周期管理
RFC 5280X.509 PKI 证书和 CRL Profile证书有效期、扩展字段
RFC 6125基于域名的服务标识验证SAN 扩展必要性
NIST SP 800-131A Rev.2密码算法与密钥长度安全使用SHA-1 禁止使用

扩展:自定义扫描规则

部署建议

1. Cron 定时扫描

BASH
# 每天凌晨 2 点扫描
0 2 * * * cd /home/ubuntu && python3 pki_scanner.py --config endpoints.yaml

2. 集成到 CI/CD

3. 告警触发

当检测到以下问题时,建议立即告警:

  • 证书剩余天数 < 7(紧急续期)
  • 评分 < 60(不合规端点)
  • 使用 SHA-1(安全红线)

常见问题

Q1:为什么 OpenSSL 不支持国密密码套件探测?

标准 Ubuntu 发行版的 OpenSSL 未编译国密模块。需要探测国密套件时,需要:

  • 使用 Tongsuo(铜墙铁壁)国密 OpenSSL:git clone https://github.com/Tongsuo-Project/Tongsuo
  • 或使用 GmSSL 分支 OpenNginx 等支持国密的 Web 服务器
Q2:扫描内网端点需要什么网络条件?

扫描器只需要能访问目标端口的 TCP 443 连接,不需要出网。证书链获取通过 TLS 握手完成,密码套件的探测使用常规 SSL/TLS 客户端逻辑。

Q3:如何验证扫描器自身的准确性?

建议交叉验证:

BASH
# openssl 获取证书
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text

# 与扫描器解析结果对比关键字段:序列号、有效期、签名算法

总结

本文构建的 PKI 端点合规扫描器具有以下价值:

  • 自动化:批量扫描替代人工逐个检查
  • 可扩展:规则引擎支持动态添加自定义合规规则
  • 国密感知:具备国密密码套件探测框架(需本地 OpenSSL 支持)
  • 可输出:结构化 JSON 报告,方便集成到告警和监控系统
对于正在进行国密改造的企业,这个工具可以作为密码资产盘点的第一步——先摸清现状,再规划改造路线。

参考来源