Censys 联动
crt.sh 善于"证书本身"的检索,Censys 善于"证书在互联网上的暴露面"检索。两者联动,能力互补。SDK 的 BuildCensysURL 把 crt.sh 的查询翻译成 Censys 查询 URL。
互补关系
📜crt.sh 强项
证书签发历史、按 SHA 指纹/序列号查、CT 日志全景
🌐Censys 强项
证书在哪些主机上使用、全网扫描暴露面、实时端口/服务指纹
🔗BuildCensysURL
把 crt.sh 查询翻译成 Censys URL,衔接两者
flowchart LR subgraph crtsh["crt.sh 强项"] A1["证书签发历史"] A2["按 SHA 指纹/序列号查"] A3["CT 日志全景"] end subgraph censys["Censys 强项"] B1["证书在哪些主机上使用"] B2["全网扫描的暴露面"] B3["实时端口/服务指纹"] end crtsh -->|"BuildCensysURL 衔接"| censys
BuildCensysURL
go
u, _ := crtsh.BuildCensysURL("dNSName", "example.com")
// u = https://search.censys.io/search?resource=certificates&q=...零网络
这是 SDK 里少数不发 HTTP 请求的方法——纯字符串映射,零延迟、零网络。
类型映射
BuildCensysURL 把 crt.sh 的搜索类型翻译成 Censys 的查询语法:
| crt.sh 类型 | Censys 查询字段 |
|---|---|
c | fingerprint_sha1 OR fingerprint_sha256 |
serial | parsed.serial_number_hex |
sha1 | fingerprint_sha1 |
sha256 | fingerprint_sha256 |
ca / CAName | parsed.issuer_dn |
Identity | names |
CN | parsed.subject.common_name |
OU | parsed.subject.organizational_unit |
O | parsed.subject.organization |
dNSName | parsed.extensions.subject_alt_name.dns_names |
rfc822Name | parsed.extensions.subject_alt_name.email_addresses |
iPAddress | parsed.extensions.subject_alt_name.ip_addresses |
Censys 不支持的类型
会返回 InvalidError
Censys 不支持以下 crt.sh 类型:id、ctid、ski、spkisha1、spkisha256、subjectsha1、E、CAID
这与 crt.sh 前端 JS 的 alert() 行为一致——SDK 忠实复刻了它的 CensysUnsupportedTypes 白名单。
典型联动流程
flowchart TD S["crt.sh 搜某域名"] --> IDS["拿到证书 ID/SHA"] IDS --> BCU["BuildCensysURL(sha256, ...)"] BCU --> CU["Censys 查询 URL"] CU --> CEN["Censys 搜:哪些主机在用这张证书"]
go
// crt.sh 找证书 → Censys 找使用方
certs, _, _ := client.SearchCertificates(ctx, crtsh.QueryParams{Q: "example.com"})
if len(certs) > 0 {
censysURL, _ := crtsh.BuildCensysURL("dNSName", "example.com")
fmt.Println("去 Censys 看暴露面:", censysURL)
}功能原理到这里讲完了
接下来看 使用方式。