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。
原生 Go 实现覆盖 Fermat、ROCA、无效 RSA 参数、polynomial 模式、共享素数、 Wiener 小私钥指数、小素因子、RSA 尺寸与指数建议、bit bias、重复模式、XZ payload、DSA sparse key 和已知密钥 blocklist。
若算法能够恢复 RSA 因子,报告会直接包含 PKCS#8 PEM 私钥及恢复方法。相关报告 必须按敏感材料处理。
ZLint warning 和 error 当前统一映射为 BEST_PRACTICE。由 badkeys 提供更强证据
的部分密码学问题会被抑制,避免重复报告。
启用 clickhouse.enabled 后:
keysharing按 SPKI SHA-256 统计证书、名称、组织和 CA,并区分疑似续期、 同组织复用、跨组织复用和跨 CA 复用;reissuance按完整规范化 SAN 集合检索签发事件,计算相邻间隔、均值、中位数、 标准差和 CoV;只有符合 burst 规则的事件产生THREAT。
数据库密码只从 CLICKHOUSE_PASSWORD 环境变量读取,不会写入配置或报告。
网络分析默认关闭。使用 --enable-network 后,程序直接扫描证书 DNS SAN 和 IP SAN;
可选的 --denylist 会在连接前排除精确域名、IP、CIDR
或全部目标。扫描仍受最大目标数、并发数、连接超时和单目标超时限制。
只有服务器返回的叶证书 SHA-256 或 SPKI 与输入证书匹配时,部署问题才会归因给 该证书。HTTP body 和原始 header 不进入报告。
Heartbleed 使用独立的 TLSVulnerabilityProbe 扩展边界。默认实现返回
unsupported,不会发送畸形 heartbeat,也不会把“未执行探测”表述为“安全”。
默认配置见 default.yaml。配置解析采用严格模式,未知字段会 直接返回错误。检查选择优先级如下:
- 默认注册全部检查,或使用配置文件中的
checks.enable作为基础集合; - CLI
--enable-checks存在时,使用其作为显式选择; - 配置和 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。