这个项目解决什么
crt.sh-skills 不是重新造一个 CT 搜索引擎,而是给 crt.sh 做一层全栈适配层。它解决的痛点可以用四个场景说清楚。
痛点一:程序化访问太脆
直接调 crt.sh 的网页端点,你会遇到一连串麻烦:
- 01详情页只返回 HTML?id=12345 是 HTML,得自己写正则/gocolly 抠字段
- 02搜索类型即参数名写错大小写就查不到(?CN= 有效,?cn= 不一定)
- 03布尔参数格式特殊exclude=expired、deduplicate=Y,猜不对
- 04没有分页元数据得自己解析 HTTP Link header
- 055xx 抖动频繁得自己写退避重试
本项目的 SDK 把这些全部封装:统一 buildQuery、HTML 详情页解析器 parseCertDetailHTML、Link header 分页解析、指数退避重试、强类型错误。你只管传 QueryParams,拿 []Certificate。
一行对照
裸调 crt.sh:拼 URL → 发请求 → 读 HTML → 正则抠字段 → 处理重试 → 解析分页 → 容错 用 SDK:client.SearchCertificates(ctx, params) → 拿 []Certificate
痛点二:AI 工具接不上 crt.sh
Claude Code、Cursor 这类 AI agent 不能"点网页"。它们需要结构化的工具调用——明确的输入 schema、稳定的输出、可枚举的选项。
flowchart LR U["用户:帮我查 example.com 的证书"] --> AI["AI Agent"] AI -->|没有工具| X["❌ 只能建议你去网页查"] AI -->|有 MCP 工具| T["调用 search_certificates"] T --> SDK["SDK → crt.sh"] SDK --> R["结构化结果"] R --> AI --> U["✅ 用自然语言回答"]
本项目用两种形态满足:
🔌MCP Server
20 个工具,stdio/HTTP/SSE 传输,任何 MCP 兼容客户端即装即用
📖Skills
7 个 SKILL.md,告诉 AI 何时用哪个工具、参数怎么填、结果怎么读
痛点三:人类/脚本想要命令行
运维想 cron 里跑一条命令监控自家域名新签发的证书;安全研究者想把搜索结果导成 CSV 喂给 Excel。
$ crtsh-cli search example.com --exclude-expired --deduplicate
ID NOT_BEFORE NAME_VALUE
12345 2024-01-02 example.com, www.example.com
...
$ crtsh-cli search example.com -o csv > certs.csv
✓ 33 条已写入 certs.csv
ID NOT_BEFORE NAME_VALUE
12345 2024-01-02 example.com, www.example.com
...
$ crtsh-cli search example.com -o csv > certs.csv
✓ 33 条已写入 certs.csv
26 条 CLI 命令,支持 JSON/表格/CSV 三种输出。
痛点四:Go 程序想嵌入
你想在自己的 Go 项目里集成 CT 查询能力。直接 import SDK,20 个方法 + 辅助函数 + 自动分页迭代器 IterateCertificates。
go
client := crtsh.NewClient()
err := client.IterateCertificates(ctx, crtsh.QueryParams{Q: "example.com"}, func(c crtsh.Certificate) bool {
fmt.Println(c.ID, c.NameValue)
return true // 返回 false 提前停止
})解决得如何:一张全景图
flowchart TB subgraph 用户["四类用户"] A["AI Agent"] H["人类/脚本"] G["Go 程序"] M["MCP 客户端"] end subgraph 封装["crt.sh-skills 四层"] S1["Skills<
>7 个 SKILL.md"] S2["MCP Server<
>20 工具"] S3["CLI<
>26 命令"] S4["Go SDK<
>20 方法"] end subgraph 核心["统一 SDK 核心 pkg/crtsh"] B["buildQuery 参数构造"] P["parser.go HTML 解析"] R["retry + 退避"] E["typed errors"] end A --> S1 M --> S2 H --> S3 G --> S4 S1 --> S2 S2 --> S4 S3 --> S4 S4 --> B B --> P B --> R P --> E 核心 --> CRT["crt.sh"]
>7 个 SKILL.md"] S2["MCP Server<
>20 工具"] S3["CLI<
>26 命令"] S4["Go SDK<
>20 方法"] end subgraph 核心["统一 SDK 核心 pkg/crtsh"] B["buildQuery 参数构造"] P["parser.go HTML 解析"] R["retry + 退避"] E["typed errors"] end A --> S1 M --> S2 H --> S3 G --> S4 S1 --> S2 S2 --> S4 S3 --> S4 S4 --> B B --> P B --> R P --> E 核心 --> CRT["crt.sh"]
关键点
四层共用同一个 SDK 核心。MCP 工具、CLI 命令、Skills 的能力都最终落到 pkg/crtsh 的方法上——这意味着加一个 crt.sh 能力,只需在 SDK 加一个方法,再在 MCP/CLI 各加一层薄封装,能力就同步贯通了。
量化指标
| 维度 | 数量 | |
|---|---|---|
| 搜索类型 | 22 | 可枚举 |
| 匹配模式 | 7 | 可枚举 |
| 结果分组模式 | 3 | 可枚举 |
| 排序方向 | 3 | 可枚举 |
| 证书 linter | 5 | 可枚举 |
| SDK 方法 | 20 | 程序 |
| MCP 工具 | 20 | AI |
| CLI 命令 | 26 | 人类 |
| Skills | 7 | AI |
| 信息页 | 13 | 宏观 |
想立刻跑起来?
看 快速开始。