Skip to content

Repository files navigation

Certificate Security Analyzer

Certificate Security Analyzer 是面向单张 X.509 证书的安全分析工具。它将弱密钥 检测、证书规范检查、CT 数据关联和受控 TLS/HTTPS 采集整合为统一流水线,并 输出具有稳定格式版本的 JSON 或 Markdown 报告。

主要能力

能力 实现 默认状态
证书解析 PEM/DER 自动识别,标准库与 zcrypto 双解析,证书/TBS/SPKI 指纹 启用
弱密钥分析 原生 Go badkeys 检测、受管共享素数库和 blocklist 启用
规范检查 ZLint v3.7.1,显式安全等级映射和重复项抑制 启用
CT 关联 ClickHouse SPKI 复用和精确 SAN 集合重签发分析 可选
部署采集 基于 zgrab2 的 TLS/HTTPS 元数据采集和证书归因 可选
报告 ATTACK、THREAT、BEST_PRACTICE 分组,JSON/Markdown 同源渲染 启用

执行引擎支持检查并发、panic 隔离、成功与失败结果缓存、稳定排序和部分报告。 单个可选检查失败不会丢失其他检查已经产生的结果。

环境要求

  • Go 1.26;
  • badkeys 受管数据包(通过 update-data 获取);
  • ClickHouse 仅在启用 CT 关联分析时需要;
  • 网络访问仅在显式启用部署采集或更新数据时需要。

快速开始

下载依赖并编译:

go mod download
go build -o cert-analyzer ./cmd/cert-analyzer

安装经过 SHA-256 校验的 badkeys 数据:

./cert-analyzer update-data

生成包含所有逐项检查详情的 Markdown 报告:

./cert-analyzer analyze \
  --cert examples/01-rsa-2048-self-signed-baseline/certificate.pem \
  --format markdown \
  --report-mode detailed \
  --output report.md

生成 JSON 报告:

./cert-analyzer analyze \
  --cert /path/to/certificate.der \
  --format json \
  --output report.json

从编译到运行的直接示例见常用命令,更完整的参数与配置说明见 完整命令手册

报告模型

摘要版只输出 security_summary,并固定包含三个数组:

{
  "security_summary": {
    "attack": [],
    "threat": [],
    "best_practice": []
  }
}
  • ATTACK:已验证的利用结果,例如成功分解 RSA 模数或恢复私钥;
  • THREAT:具有安全影响但未直接恢复秘密材料的弱点;
  • BEST_PRACTICE:规范、配置或加固建议。

详细版在同一摘要之外提供 checks_in_detail。每项包含中文检查范围、执行状态、 耗时和 details;无问题、跳过和失败也都有明确记录。报告不再输出 passed_checks 或检查类别。

report_format_version 表示报告字段结构的版本,不是 X.509 版本,也不是工具版本; 当前破坏性调整后的详细格式版本为 2.0。完整结构分别见 摘要版 Schema详细版 Schema。代表性输入和 实际生成的报告见 examples

检查模块

badkeys

原生 Go 实现覆盖 Fermat、ROCA、无效 RSA 参数、polynomial 模式、共享素数、 Wiener 小私钥指数、小素因子、RSA 尺寸与指数建议、bit bias、重复模式、XZ payload、DSA sparse key 和已知密钥 blocklist。

若算法能够恢复 RSA 因子,报告会直接包含 PKCS#8 PEM 私钥及恢复方法。相关报告 必须按敏感材料处理。

ZLint

ZLint warning 和 error 当前统一映射为 BEST_PRACTICE。由 badkeys 提供更强证据 的部分密码学问题会被抑制,避免重复报告。

ClickHouse 关联

启用 clickhouse.enabled 后:

  • keysharing 按 SPKI SHA-256 统计证书、名称、组织和 CA,并区分疑似续期、 同组织复用、跨组织复用和跨 CA 复用;
  • reissuance 按完整规范化 SAN 集合检索签发事件,计算相邻间隔、均值、中位数、 标准差和 CoV;只有符合 burst 规则的事件产生 THREAT

数据库密码只从 CLICKHOUSE_PASSWORD 环境变量读取,不会写入配置或报告。

TLS/HTTPS 采集

网络分析默认关闭。使用 --enable-network 后,程序直接扫描证书 DNS SAN 和 IP SAN; 可选的 --denylist 会在连接前排除精确域名、IP、CIDR 或全部目标。扫描仍受最大目标数、并发数、连接超时和单目标超时限制。

只有服务器返回的叶证书 SHA-256 或 SPKI 与输入证书匹配时,部署问题才会归因给 该证书。HTTP body 和原始 header 不进入报告。

Heartbleed 使用独立的 TLSVulnerabilityProbe 扩展边界。默认实现返回 unsupported,不会发送畸形 heartbeat,也不会把“未执行探测”表述为“安全”。

配置

默认配置见 default.yaml。配置解析采用严格模式,未知字段会 直接返回错误。检查选择优先级如下:

  1. 默认注册全部检查,或使用配置文件中的 checks.enable 作为基础集合;
  2. CLI --enable-checks 存在时,使用其作为显式选择;
  3. 配置和 CLI 的 disable 列表最后应用,因此始终优先。

退出码

退出码 含义
0 分析完整,且没有触发 --fail-on
1 内部致命错误
2 输入或配置无效
3 已生成部分报告,但至少一个启用检查失败
10 达到 `--fail-on attack

安全注意事项

  • 输出文件以 0600 权限创建;
  • 恢复出的私钥只写入最终报告,不写入错误日志;
  • badkeys 更新文件在原子替换前逐项校验 SHA-256;
  • 网络扫描只使用证书提取的目标,denylist 在连接前生效,且不会从通配符名称推导根域;
  • ClickHouse 表名和数据库名经过 SQL identifier 校验;
  • 主动漏洞探针必须由调用方显式授权和安装。

开发与验证

go test -race ./...
go vet ./...
go build -o cert-analyzer ./cmd/cert-analyzer

网络测试使用本地 TLS 服务,不访问公网。真实 ClickHouse 集成测试通过环境变量 显式启用,具体命令见常用命令手册

文档

第三方来源

弱密钥检测语义基于 MIT 许可证的 badkeys,固定参考提交为 5968aaa4ce70a7f647ba638c9fa28cf96048042f。ZLint 固定为 v3.7.1;zgrab2 固定到包含并发超时修复的上游提交 e8fbc9eff230。完整归属信息见 THIRD_PARTY_NOTICES.md

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages