logiover/certificate-transparency-monitor

GitHub: logiover/certificate-transparency-monitor

一个基于 Apify 的证书透明度日志监控工具,通过 crt.sh 无需 API Key 即可拉取 TLS 证书数据,用于子域名发现、资产监控和攻击面测绘。

Stars: 0 | Forks: 0

# 证书透明度监控 — CT 日志与子域名侦察 (crt.sh, 无需 API Key) [![在 Apify 上运行](https://img.shields.io/badge/Apify-Run%20Actor-00A67E?logo=apify&logoColor=white)](https://apify.com/logiover/certificate-transparency-monitor) [![无需 API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f)](https://apify.com/logiover/certificate-transparency-monitor) [![按结果付费](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6)](https://apify.com/logiover/certificate-transparency-monitor) [![导出](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)](https://apify.com/logiover/certificate-transparency-monitor) **用于安全、侦察和资产发现的免 Key 证书透明度情报。** **Certificate Transparency Monitor** 从 CT 日志 (crt.sh) 中拉取任意域名的 **TLS 证书**,并将每张证书转换为一行结构化数据,包含**颁发者、有效期窗口、SAN 主机名和序列号**。它提供四种运行模式:**watch**(监控过去 N 天内记录的新证书,用于日常监测)、**subdomains**(通过通配符查询发现某个域名下所有被颁发过证书的主机名)、**domain**(获取完整的证书历史记录)或 **bulk**(批量扫描整个监控列表)。 它是用于 CT 日志监控、子域名枚举、品牌冒充检测以及为 AI 安全 Agent 提供**当前基础设施数据**支撑的非官方 **crt.sh / CT 日志 API 层**。**无需 API Key,无需无头浏览器** — 您只需为保存的证书付费,未获取到任何证书的运行不收取费用。结果可导出为 JSON、CSV、Excel、JSONL 或 XML 格式。 ## 📜 您将获得什么 / 输出字段 (每张证书 13 个字段) 每次运行都会**以一行对应一张证书的形式**输出数据: | 字段 | 类型 | 描述 | |-------|------|-------------| | `query` | string | 使用的确切 CT 日志查询(一个域名,或子域名模式下的 `%.domain`)。 | | `domain` | string | 发现此证书的目标域名。 | | `certId` | integer | crt.sh 证书 ID。 | | `commonName` | string | 证书的通用名称 (CN),例如 `*.stripe.com`。 | | `nameValues` | array | 主题备用名称 (SAN) — 该证书有效的所有主机名。 | | `issuerName` | string | 颁发机构 CA 名称 (Let's Encrypt, DigiCert, Google 等)。 | | `serialNumber` | string | 证书序列号。 | | `notBefore` | string | 有效期起始时间 (ISO 8601)。 | | `notAfter` | string | 有效期截止/过期时间 (ISO 8601)。 | | `entryTimestamp` | string | 证书被记录到 CT 日志的时间 (ISO 8601)。 | | `loggedDate` | string | 日志记录的日期部分 (`YYYY-MM-DD`)。 | | `isExpired` | boolean | 如果 `notAfter` 已成为过去时间,则为 `true`。 | | `scrapedAt` | string | 数据抓取时间戳 (ISO 8601)。 | 数据集提供两种视图:**Overview**(每张证书的颁发者 + 有效期)视图和用于查看已发现主机名的 **Subdomains (SAN)** 视图。 ## 💡 使用场景 - **新基础设施检测** — 每天对目标运行 `watch` 模式,当发现以前未见过的主机名记录了新证书时发出警报,从而在 DNS 或端口扫描之前捕获新服务、预发布环境和影子 IT。 - **子域名枚举** — 运行 `subdomains` 模式,通过 CT SAN 被动收集并构建完整的主机名清单,覆盖范围比 DNS 暴力破解更广。 - **品牌保护 / 相似域名检测** — 查询品牌字符串,以便在冒充域名(如 `stripe-login.com`、`secure-stripe.com`)被颁发证书的那一刻将其标记出来。 - **颁发者 / CA 跟踪** — 跟踪目标使用的 CA,并对异常情况发出警报(例如,突然转向经常用于网络钓鱼的廉价 CA)。 - **攻击面差异化对比** — 安排每周执行 `domain` 运行,对比证书集合,并将新增/移除的主机名作为攻击面的变化进行报告。 - **基于基础设施的 RAG** — 将证书源嵌入到向量存储中,并引用确切的证书来回答“X 主机名是什么时候首次出现的?”。 - **威胁情报流水线** — 将新证书馈送到 SIEM 中,并将颁发者/主机名模式与已知的攻击者 TTP 进行关联。 ## 🚀 快速开始 — 四种运行方式 ### 1. Apify Console (无需代码) 打开 Actor,点击 **Try for free**,然后点击 **Start** 使用默认输入拉取 `google.com` 的证书。接着选择一种**模式**,为其指定目标,然后再次运行。 ▶️ **[在 Apify Console 中打开 Certificate Transparency Monitor](https://apify.com/logiover/certificate-transparency-monitor)** ### 2. Apify CLI ``` npm install -g apify-cli apify login apify call logiover/certificate-transparency-monitor \ --input='{ "mode": "subdomains", "domain": "stripe.com", "maxPerDomain": 2000 }' ``` ### 3. API / curl (在一次调用中运行并获取结果) ``` curl -X POST "https://api.apify.com/v2/acts/logiover~certificate-transparency-monitor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "mode": "domain", "domains": ["stripe.com", "linear.app", "vercel.com"], "maxPerDomain": 1000 }' ``` ### 4. apify-client (JavaScript & Python) ``` import { ApifyClient } from 'apify-client'; const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' }); const run = await client.actor('logiover/certificate-transparency-monitor').call({ mode: 'subdomains', domain: 'stripe.com', maxPerDomain: 2000, }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); console.log(items); ``` ``` from apify_client import ApifyClient client = ApifyClient("YOUR_APIFY_TOKEN") run = client.actor("logiover/certificate-transparency-monitor").call(run_input={ "mode": "subdomains", "domain": "stripe.com", "maxPerDomain": 2000, }) for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(item["commonName"], item["nameValues"]) ``` 请查看 [`examples/`](./examples) 文件夹以获取更完整的 CLI、API、JavaScript 和 Python 代码片段。 ## 📥 输入 选择一种 `mode`,然后提供相应的目标。其余选项均为可选 — **将输入留空即可拉取 `google.com` 的证书作为演示。** | 字段 | 类型 | 默认值 | 描述 | |-------|------|---------|-------------| | `mode` | 下拉菜单 | `domain` | `domain` (单个/多个域名的所有证书),`watch` (N 天内的新证书),`subdomains` (通配符发现),`bulk` (多个域名)。 | | `domain` | string | `google.com` | 用于 `watch` / `subdomains` 模式的单个域名。 | | `domains` | array | — | 用于 `domain` / `bulk` 模式的域名。 | | `daysBack` | integer | `7` | `watch` 模式向前回溯的天数 (1–365)。`1` = 今天的新证书。 | | `maxPerDomain` | integer | `1000` | 每个域名保存的证书数量上限 (1–20000)。热门域名通常会有数万条记录。 | | `excludeExpired` | boolean | `false` | 丢弃已超过其 `notAfter` 时间的证书(当前攻击面视图)。 | | `dedupBySerial` | boolean | `true` | 根据序列号合并 precertificate 和最终证书的重复项。 | | `useApifyProxy` | boolean | `true` | 通过 Apify 代理路由(有助于提高可靠性,并自动重试)。 | ## 📤 输出 — 示例记录 ``` { "query": "stripe.com", "domain": "stripe.com", "certId": 12345678901, "commonName": "*.stripe.com", "nameValues": ["stripe.com", "www.stripe.com", "api.stripe.com", "dashboard.stripe.com"], "issuerName": "DigiCert TLS RSA SHA256 2020 CA1", "serialNumber": "0abc123def456...", "notBefore": "2026-06-28T00:00:00.000Z", "notAfter": "2027-07-03T23:59:59.000Z", "entryTimestamp": "2026-06-28T12:34:56.789Z", "loggedDate": "2026-06-28", "isExpired": false, "scrapedAt": "2026-07-06T12:00:00.000Z" } ``` ## 🔌 集成与自动化 - **定时任务** — 在 Apify 上每天运行 `watch`,以捕获您目标的所有新证书。 - **Webhooks** — 在一次运行结束后,立即将新证书推送到 SIEM、Slack 或您的 API。 - **Google Sheets / Amazon S3 / 向量存储 / 数据库** — 通过 Apify 集成,将数据源导出到电子表格、S3 存储桶、embeddings 存储或数据仓库。 - **Zapier · Make · n8n · Pipedream · MCP** — 将其接入无代码侦察流水线,或将其作为 **MCP 工具** 暴露出来,以便安全 Agent 可以按需查询 CT 日志。 ## 📦 导出格式 结果存储在 Apify 数据集中,并可导出为 **JSON、CSV、JSONL、Excel (XLSX) 和 XML** 格式,或通过 Apify API 实时读取。 ## ❓ 常见问题解答 ### 这个 Actor 需要任何 API Key 或登录吗? 不需要。它查询 **crt.sh**,这是一个公共的证书透明度日志搜索引擎,完全不需要密钥。无需账户、无需登录、无需无头浏览器 — 只需要一个 Apify 账户。 ### 它是 crt.sh API 的替代品吗? 是的。crt.sh 没有用于自动化、干净且结构化的公共 API。这个 Actor 将 CT 日志搜索封装为一个可靠的、分页的、具备重试机制且字段规范化(如 SAN 拆分、去重、过滤)的层 — 是面向流水线和 AI Agent 的一种实用的 **crt.sh / CT 日志 API 替代方案**。 ### 我可以通过证书透明度发现子域名吗? 是的 — 这就是 `subdomains` 模式。通配符查询可以通过 SAN (`nameValues`) 字段,展示出某个域名下所有曾经被颁发过证书的主机名。对于大型组织,这通常包含数百到数千个主机名。这种被动收集方式比 DNS 暴力破解覆盖范围更广。 ### 我该如何监控新颁发的证书? 使用 `watch` 模式并将 `daysBack` 设置为 `1`,同时将 Actor 安排为每天运行;它只会返回过去 24 小时内记录的证书,让您在新基础设施出现时就能捕获它。 ### 数据的时效性如何? CT 日志是仅追加的,并且几乎是实时的 — 几分钟前记录的证书通常会在几分钟到几个小时内出现。 ### 为什么有些证书会重复(在去重之前)? CT 日志会记录每次证书颁发时的 precertificate 和最终证书,它们通常具有相同的序列号。`dedupBySerial: true`(默认值)会将它们合并为一行。 ### 我该如何将证书导出为 CSV 或 JSON 格式? 运行 Actor,然后从 Apify Console 将数据集导出为 **CSV、JSON、Excel 或 XML**,或者通过 Apify API / MCP 实时拉取。 ### 我可以获取多少数据? `maxPerDomain` 最高可达**每个域名 20,000 张证书**,而 `bulk` 模式可以扫描整个列表。对于大型组织,一次 `subdomains` 通配符查询通常每次运行会产生数百到数千行记录。 ### AI Agent 可以直接调用它吗? 可以 — 这是一个主要的设计目标。通过 MCP server 或 Apify 工具集成将其暴露出来;Agent 只需传入域名和模式,即可接收结构化的证书/子域名返回结果,而无需在 Agent 端进行任何 CT 日志抓取或 SAN 解析。 ### 使用它合法吗? CT 日志数据在设计上是公开的 — 这是 CA/Browser Forum 基准要求所强制规定的 — 并且证书持有者在颁发证书时同意将其记录在案。请将其用于合法的安全监控、资产发现、品牌保护以及基于已经公开的数据为 AI Agent 提供支撑,同时请尊重 crt.sh 的使用指南。 ## 🔗 logiover 的相关 Actor - ▶️ [**Subdomain Finder**](https://apify.com/logiover/subdomain-finder) — 多源子域名枚举 (主动 + CT),用于补充此数据源。 - ▶️ [**Bulk WHOIS / RDAP Lookup**](https://apify.com/logiover/bulk-whois-rdap-lookup) — 用于归因的域名所有权和注册数据。 👉 浏览 **[Apify Store 上的所有 logiover Actor](https://apify.com/logiover)**。 📄 **仅用于文档说明** — 此仓库包含使用文档和示例。Actor 本身在 Apify 平台上运行。 ▶️ **运行地址: ** 采用 [MIT License](./LICENSE) 授权 · © 2026 logiover
标签:数据可视化, 逆向工具