关于 auditing-tls-certificate-transparency-logs
面向安全与运维团队的 TLS 证书透明度日志审计技能,可监控证书签发并从证书中发现子域名。还涵盖异常告警、日志完整性验证和合规报告。
主要功能
- 01查询并整理证书清单
- 02持续监控新证书签发
- 03从证书发现并验证子域名
- 04配置证书事件告警
- 05验证日志完整性并生成报告
适用场景
- 01发现未经授权的证书签发
- 02监控新子域名与潜在钓鱼域名
- 03为证书生命周期管理提供审计记录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill auditing-tls-certificate-transparency-logs安装后在 Claude Code 中输入/auditing-tls-certificate-transparency-logs确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
审计 TLS 证书透明度日志
适用场景
- 监控自有域名,发现由未知证书颁发机构签发的未授权或意外证书
- 通过记录在公开 CT 日志中的证书发现子域名和隐藏服务
- 检测使用仿冒域名证书(域名抢注、同形异义攻击)的网络钓鱼基础设施
- 审计证书颁发机构的合规性,验证所有已签发证书均按浏览器策略要求出现在 CT 日志中
- 将持续的证书监控集成到安全运营流水线中,并对新签发的证书进行告警
请勿使用本方法攻击或干扰证书颁发机构,违反速率限制或服务条款抓取 CT 日志,或在未通过 DNS 验证佐证结果的情况下将其作为子域名枚举的唯一方法。
前置条件
- 已安装
requests、cryptography和pyOpenSSL库的 Python 3.10+ - 可访问 crt.sh(HTTPS)和公开 CT 日志服务器的网络
- 要监控的域名列表(自有域名、品牌变体、域名抢注候选)
- 用于在新发现证书时告警的 SMTP 凭据或 webhook URL
- 对 X.509 证书结构和 TLS 证书链验证有基本了解
工作流
第 1 步:域名清单与基线
为受监控域名建立初始证书清单:
- 定义监控范围:列出所有自有根域名、已注册品牌名称和已知子公司。包含通配符模式(
%.example.com)以实现全面的子域名覆盖。 - 查询 crt.sh 获取历史证书:使用 crt.sh JSON API 检索每个域名的所有已知证书。API 端点
https://crt.sh/?q=%.example.com&output=json返回匹配通配符模式的证书,字段包括issuer_ca_id、issuer_name、common_name、name_value、not_before、not_after和serial_number。 - 构建基线数据库:将初始证书集存储在本地 SQLite 数据库中,包含证书 ID、域名、颁发者、有效期、SAN(主题备用名称)和首次发现时间戳等列。该基线可防止对已知证书发出告警。
- 识别已授权 CA:从基线中提取已为你的域名合法签发证书的证书颁发机构集合。此后任何来自不在该集合中的 CA 的签发都会触发高优先级告警。
- 映射子域名:从所有证书的
name_value字段中提取所有唯一子域名,构建初始子域名清单。
步骤 2:持续 CT 日志监控
针对新证书颁发设置持续监控:
- 定期轮询 crt.sh:按固定时间间隔(每 15-60 分钟)查询 crt.sh API 以获取新证书。使用
exclude=expired参数以专注于当前有效的证书。将结果与基线数据库对比以识别新条目。 - 解析证书详情:对每张新证书,提取完整的 SAN 列表、颁发者链、有效期、密钥类型与长度、CT 日志 SCT(Signed Certificate Timestamp)详情以及证书指纹(SHA-256)。
- 检测预证书:CT 日志包含预证书(在最终颁发前提交的 poisoned 证书)。将其作为早期预警进行跟踪,因为它们表明证书即将颁发但可能尚未生效。
- 监控 CT 日志签名树头(STH):对于高级监控,直接查询 CT 日志服务器以获取最新 STH,并验证连续树头之间的一致性证明。不一致表明日志存在不当行为(split-view 攻击)。
- 限流意识:通过间隔查询和缓存响应来遵守 crt.sh 的速率限制。对 HTTP 429 响应实现指数退避。对于大规模监控,可考虑直接查询位于
crt.sh:5432的 crt.sh PostgreSQL 接口。 - Atom/RSS feed 替代方案:订阅 crt.sh 的 Atom feed 以实现更轻量的监控:
https://crt.sh/atom?q=%25.example.com可提供新日志条目的实时通知。
步骤 3:通过 CT 数据发现子域名
提取并验证证书透明度数据中发现的子域名:
- 通配符展开:带有通配符 SAN(
*.dev.example.com)的证书揭示了可能不在 DNS 区域文件中的子域名的存在。将父域名记录为进一步枚举的目标。 - 历史证书挖掘:在不使用
exclude=expired参数的情况下查询 crt.sh,以从已过期证书中发现可能仍在 DNS 中解析的子域名。这些代表了可能容易受到子域名接管攻击的历史基础设施。 - DNS 验证:对每个发现的子域名执行 DNS 解析(A、AAAA、CNAME 记录),以确定该子域名当前是否活跃。与已知 IP 范围交叉比对,以识别影子 IT 或未授权服务。
- 域名抢注检测:生成被监控域名的排列变体(bitsquatting、homograph、插入、遗漏、换位、键盘相邻替换),并查询 CT 日志以获取颁发给这些变体的证书。为抢注域名颁发的证书强烈表明存在钓鱼基础设施。
- 去重与丰富:规范化发现的子域名(转为小写、移除末尾点号),去重,并使用 WHOIS 数据、IP 地理位置和 HTTP 响应头进行丰富,以确定调查优先级。
第 4 步:证书签发告警
为与安全相关的证书事件配置告警规则:
- 未授权 CA 告警:当证书由不在授权 CA 列表中的 CA 签发时触发。这是最高优先级的告警,因为它可能表明域名劫持、用于域名验证的 BGP 劫持,或 CA 被攻陷。
- 新子域告警:当证书包含带有此前未见过的子域的 SAN 时触发。这可捕获影子 IT 部署和未授权服务。
- 通配符证书告警:在任何新的通配符证书签发时触发,因为通配符证书一旦被攻陷影响范围更大,其签发应受到严格控制。
- 短有效期证书异常:当证书的有效期异常短(低于 24 小时),偏离组织的正常证书生命周期时告警,因为这可能表明 Let's Encrypt 被滥用或自动化钓鱼基础设施。
- 到期警告:当关键服务的证书临近到期(30、14、7 天)时,根据 CT 日志数据中的
not_after字段告警。 - 告警投递:通过电子邮件(SMTP)、Slack webhook、PagerDuty 发送告警,或写入与 SIEM 兼容的 JSON 日志格式,以便与现有安全监控集成。
第 5 步:CT 日志完整性验证与报告
验证日志完整性并生成合规证据:
- 签名树头(STH)监控:通过
get-sthAPI 端点从每个受监控的 CT 日志获取最新 STH。STH 包含树大小和签名时间戳。使用日志的公钥验证签名。 - 一致性证明验证:在连续两次 STH 获取之间,通过
get-sth-consistency请求一致性证明,以验证日志保持仅追加,且没有任何条目被修改或删除。 - 证书清单报告:生成受监控域名的所有已签发证书的完整清单,按签发者分组,并附有效状态和密钥强度指标。
- CA 多样性分析:报告有多少不同的 CA 为组织签发证书,识别整合机会和单点故障。
- 合规证据:对于受 PCI-DSS、SOC 2 或类似框架约束的组织,CT 监控日志可提供证书生命周期管理和未授权签发检测能力的证据。
核心概念
| 术语 | 定义 |
|---|---|
| 证书透明度 (CT) | 一个开放框架(RFC 6962),要求证书颁发机构将所有已签发的证书记录在可公开审计的仅追加日志中,使域名所有者能够检测到未经授权的签发 |
| 签名证书时间戳 (SCT) | CT 日志做出的一项承诺,表示证书将在最大合并延迟(通常为 24 小时)内被纳入日志;浏览器要求证书具备来自多个日志的 SCT 后才会信任该证书 |
| Merkle 树 | CT 日志使用的密码学数据结构,其中叶节点是证书哈希,父节点是其子节点的哈希,从而能够高效地生成一致性和包含证明 |
| 预证书 | 在最终签发之前提交给 CT 日志的证书,包含一个毒化扩展(OID 1.3.6.1.4.1.11129.2.4.3),该扩展可防止其被用于 TLS,但在日志中为其保留位置 |
| crt.sh | 由 Sectigo 运营的免费 Web 服务,将来自所有主要 CT 日志的证书汇总到可搜索的 PostgreSQL 数据库中,同时提供 Web 和 API 访问 |
| 子域名接管 | 一种漏洞,其中子域名的 DNS 记录指向已停用的服务(云服务商、CDN),攻击者可重新占用该服务,而这一漏洞可通过已过期的 CT 证书被发现 |
| 最大合并延迟 (MMD) | CT 日志在返回 SCT 后,将已提交证书纳入其 Merkle 树所需的最长时间(通常为 24 小时) |
| CAA 记录 | DNS 证书颁发机构授权记录,指定哪些 CA 被允许为该域名签发证书;CT 监控可检测对 CAA 策略的违反行为 |
工具与系统
- crt.sh:主要的 CT 日志聚合器,在
https://crt.sh/?q=<query>&output=json提供 JSON API 访问,支持通配符查询、身份过滤和证书详情检索 - ct-woodpecker:来自 Let's Encrypt 的开源 CT 日志监控工具,可与 Prometheus 和 Grafana 集成,用于对日志健康状况和一致性进行运维监控
- certspotter:SSLMate 的 CT 日志监控器,用于监视新签发的证书并发送通知;可作为托管服务或可自托管工具使用
- Google Argon / Xenon / Icarus:由 Google 运营的 CT 日志,属于使用最广泛的日志之列,可通过其各自日志 URL 上的 RFC 6962 API 进行查询
- OpenSSL:命令行工具,用于解析证书详情、验证证书链,以及从通过 CT 监控获取的证书中提取 SAN 列表
常见场景
场景:为金融服务公司检测未授权的证书签发
背景:一家银行监控其主域名(bank.example.com),并通过 CT 日志发现,有一张证书由其从未使用过的 CA 签发,涵盖 secure-login.bank.example.com——这是一个在其 DNS 中不存在的子域名。
方法:
- CT 监控 Agent 在 crt.sh 结果中检测到 “FreeSSL CA” 为
secure-login.bank.example.com签发的新证书,而该 CA 不在授权 CA 列表(DigiCert、Sectigo)中 - 由于未授权 CA + 新子域名而触发告警,并在 CT 日志记录出现后 15 分钟内上报给安全团队
- 调查该证书:提取公钥,检查该域名是通过 HTTP-01 还是 DNS-01 challenge 完成验证,查询 WHOIS 获取签发组织
- 对
secure-login.bank.example.com进行 DNS 查询,发现它解析到该银行未使用的一家托管服务商中的 IP 地址——确认这是攻击者基础设施 - 启动事件响应:向 FreeSSL CA 请求吊销证书,提交域名滥用报告,将该 IP 添加到阻止列表,并通知反钓鱼团队
- 实施 CAA DNS 记录(
bank.example.com. CAA 0 issue "digicert.com"),以防止未授权 CA 在未来签发证书
陷阱:
- 未监控通配符模式(
%.bank.example.com),从而遗漏子域名证书 - 忽视在实际证书签发前出现在 CT 日志中的预证书,从而失去提前预警优势
- 事件发生后未能验证所有域名上的 CAA 记录均已正确配置
- 由于授权变更后未更新基线数据库,而对合法证书续期产生过多告警
场景:通过 CT 日志子域名发现进行攻击面测绘
背景:渗透测试人员将 CT 日志作为外部侦察的第一阶段,在主动扫描前测绘目标组织面向互联网的服务。
方法:
- 在 crt.sh 中查询
%.target.com以及所有已知子公司域名,收集到跨越 8 年的 2,400 张唯一证书 - 从所有证书的 SAN 字段中提取出 347 个唯一子域名,包括已过期证书中的子域名
- 对全部 347 个子域名进行 DNS 解析,发现 189 个当前处于活跃状态并带有 A/AAAA 记录
- 识别出 12 个指向已停用云服务的子域名(CNAME 指向 S3 存储桶、Azure 端点),它们是子域名接管的候选目标
- 发现
staging-api.target.com和dev-portal.target.com,它们不在目标记录的范围内,但可访问且运行较旧版本的软件 - 向目标组织展示发现结果,说明其已知资产清单与 CT 推导出的攻击面之间的差距
陷阱:
- 未与资产所有者确认,就假定所有 CT 发现的子域名都在范围内
- 未检查通配符 DNS 响应,这类响应会让子域名看起来存在,但实际上解析到泛解析地址
- 仅依赖 CT 数据,而未与被动 DNS 数据库交叉比对以获得全面覆盖
输出格式
## CT Log Monitoring Report
**Domain**: example.com
**Monitoring Period**: 2026-03-01 to 2026-03-19
**Total Certificates Tracked**: 142
**New Certificates Detected**: 7
**Alerts Generated**: 2
### Alert: Unauthorized CA Issuance
- **Severity**: Critical
- **Certificate CN**: secure-login.example.com
- **SANs**: secure-login.example.com, www.secure-login.example.com
- **Issuer**: Unknown Free CA (NOT in authorized CA list)
- **Serial**: 04:A3:B7:2F:...:9E
- **Not Before**: 2026-03-18T00:00:00Z
- **Not After**: 2026-06-16T00:00:00Z
- **CT Log**: Google Argon 2026
- **SCT Timestamp**: 2026-03-17T22:15:33Z
- **Action Required**: Investigate immediately, request revocation
### Subdomain Discovery Summary
- **Total Unique Subdomains**: 89
- **New Subdomains This Period**: 3
- api-v3.example.com (DigiCert, valid)
- staging-new.example.com (Let's Encrypt, valid)
- old-portal.example.com (expired 2025-12-01, CNAME to Azure -- takeover risk)
### Typosquatting Alerts
| Domain | Certificate Count | Issuer | Action Required |
|--------|-------------------|--------|-----------------|
| exarnple.com | 2 | Let's Encrypt | Investigate phishing |
| examp1e.com | 1 | ZeroSSL | Investigate phishing |
评论
支持 Markdown