证书透明度日志是什么
证书透明度(Certificate Transparency,CT)要求证书颁发机构把签发的证书提交到公开的、仅可追加的日志中,任何人都能查询。这个机制最初用于发现被错误签发的证书,如今成为资产发现与暴露面核查的实用工具:按域名查询历史证书,可以列出证书中出现过的全部名称,包括早已停用、从未对外公布、或者只在测试环境使用过的子域。
基本信息
| 数据来源 | CT 日志聚合服务(如 crt.sh) |
|---|---|
| 查询维度 | 按域名模糊查询、按证书指纹查询、按颁发机构查询 |
| 典型产出 | 历史证书中出现过的名称清单(含通配符证书覆盖范围) |
| 配套动作 | 与 DNS 解析记录、资产台账交叉核对 |
典型使用场景
- 梳理子公司与业务线的域名,找出未纳入资产台账的子域
- 上线前核对通配符证书覆盖范围,评估其潜在暴露面
- 发现早已停用但仍可解析的历史域名,纳入下线清理流程
- 评估并购场景的目标方资产:从 CT 记录快速列出其域表面
- 与 DNS 记录交叉验证:CT 里有但 DNS 无解析的,可判断为已退役
crt.sh 查询示例
crt.sh 查询示例
# 查询 example.com 相关证书中出现的全部名称
curl -s 'https://crt.sh/?q=%25.example.com&output=json' \
| python3 -c "import json,sys; [print(n) for e in json.load(sys.stdin) for n in e['name_value'].split(chr(10))]" \
| sort -u > ct-names.txt
wc -l ct-names.txt # 统计名称数量
# 与 DNS 解析情况对照,筛选仍可解析的名称
grep -v '^\*' ct-names.txt | while read d; do dig +short "$d" | head -1 | sed "s|^|$d |"; done结果读法
| 现象 | 含义 | 后续动作 |
|---|---|---|
| 名称在台账中不存在 | 影子资产或历史遗留 | 确认归属,纳入管理或下线 |
| 只有通配符记录 | 具体子域未单独签发 | 按通配符覆盖范围评估暴露 |
| 有证书但无 DNS 解析 | 域名已退役 | 确认解析已清理,避免残留记录 |
| 大量测试域名 | 研发流程缺少命名规范 | 约定测试域与生产域隔离策略 |
CT 记录只反映『曾经申请过证书』,不能证明服务当前可用:必须与 DNS 解析、端口可达性一起核对才能得出暴露结论。
通配符证书会把所有子域纳入同一张证书的名称范围,反过来也让攻击者更容易从 CT 记录推断内部命名规则,域名命名应避免使用可被穷举的编号模式。