Skip to content

Atom 订阅与监控

Atom feed 是 crt.sh 的"推送"机制——订阅某个 identity,每当有新证书签发,feed 里就多一条。这是做证书监控的基础。

FetchAtomFeedFetchSearchAtomFeed监控基石/atom 端点

两个 Atom 方法

📡FetchAtomFeed
端点 `/atom?identity=val`,入参 identity 字符串。拉一次,看历史与当前
🔄FetchSearchAtomFeed
端点 `/atom?搜索参数`,入参完整 QueryParams。把任意搜索变成 feed
flowchart TD Q["你要订阅什么?"] --> Q1{只订阅某个域名/identity?} Q1 -->|是| F1["FetchAtomFeed
入参 identity 字符串"] Q1 -->|否, 要复杂搜索条件| Q2{多搜索类型 / 过滤
/ 分组 / lint?} Q2 -->|是| F2["FetchSearchAtomFeed
入参完整 QueryParams"] Q2 -->|否| F1

FetchAtomFeed 流程

flowchart TD I["identity 如 example.com"] --> V["校验 match 模式"] V --> U["/atom?identity=example.com
+ match= / exclude=expired"] U --> GET["GET, Accept: atom+xml"] GET --> XML["原始 XML"] XML --> P["parseAtomFeed"] P --> F["AtomFeed{ID,Title,Updated,Entries,URL,RawXML}"]

AtomFeedOptions 支持两个选项:

  • Match:匹配模式(同搜索的 7 种,会校验合法性)
  • ExcludeExpired:排除已过期证书
go
feed, _ := client.FetchAtomFeed(ctx, "example.com",
    crtsh.WithMatch("ILIKE"),
    crtsh.WithExcludeExpired(),
)
for _, e := range feed.Entries {
    fmt.Println(e.Published, e.Title, e.Link)
}

为什么 Atom 适合监控

sequenceDiagram participant CRON as cron(每 N 分钟) participant SDK as SDK participant CRT as crt.sh loop 每轮 CRON->>SDK: FetchAtomFeed(identity) SDK->>CRT: GET /atom?identity=... CRT-->>SDK: feed(追加的新 entry) SDK-->>CRON: AtomFeed CRON->>CRON: 对比上次最新 updated alt 有新 entry CRON->>CRON: 告警/记录 else 无新 CRON->>CRON: 等待下一轮 end end

Entries 里每条 AtomEntryPublishedUpdatedLink(指向 crt.sh 证书页)、SummaryContent。监控脚本只需记住上次的最新 Updated,新增的 entry 就是新签发的证书。

FetchSearchAtomFeed 的独特价值

任意搜索变可订阅流

它把任意复杂搜索(多搜索类型、过滤、分组、lint)都转成可订阅 feed。例如"某 CA 在某段时间签发的、zlint 有 issue 的证书"——可以做成持续监控流。

监控链路衔接

flowchart LR M["监控发现新证书 ID"] --> R["FetchRawCertificate
取 PEM"] M --> D["GetCertificateByID
取详情"] R --> OS["openssl / cryptography 解析"] D --> PV["FetchPathValidationView
校验信任链"]

监控发现新证书 ID 后,下一步往往是 FetchRawCertificate 取 PEM,或 GetCertificateByID 取详情——SDK 把这条链路全部打通。