资讯文章 资讯 · NEWS
有人给你的域名签了证书:用证书透明度日志盯住冒名签发
2026-10-23 约 1,958 字 预计阅读 5 分钟 yiyunkj
有
证书过期会收到告警,证书签发这件事却没人提醒你——除非你自己去盯。
这有个现实问题:DV 证书(域名验证型)证明的是「申请人能控制这个域名」,不是「申请人是这个域名的所有者」。谁能完成 HTTP-01 挑战、谁能往你的 DNS 区里写一条 TXT 记录,谁就能拿到一张合法证书。不需要攻破任何 CA,你的监控系统里也不会有任何异常。

图片来源:网络,版权归原作者所有,侵权请联系删除
证书透明度是什么
CT(Certificate Transparency)由 RFC 6962 定义,是一套公开、仅追加的日志系统。CA 签发证书前要把证书提交到多个独立的 CT 日志,日志返回一个 SCT(签名证书时间戳),CA 把这个 SCT 嵌进证书里。浏览器会验证 SCT,Chrome 和 Safari 都要求证书携带有效 SCT,否则直接报错。
这套机制是在几次 CA 被攻破、攻击者拿到大厂域名的合法证书却几周没人发现的事件之后建起来的。它带来的副作用正好对我们有用:
只要一张证书能在浏览器里正常工作,它就一定在公开日志里,你一定能查到。
怎么查
最省事的是 crt.sh,一个免费的 CT 日志聚合检索站,不需要账号也不需要 API key。直接搜域名,要带子域名就用通配符:
curl -s 'https://crt.sh/?q=%25.example.com&output=json' \
| jq -r '.[].name_value' | sort -u
%25 是百分号的 URL 编码,crt.sh 用它做通配符。返回结果里每一行是一条证书记录,包含覆盖的主机名、签发 CA、有效期。
对于目录站,我建议把这个查询接进定期巡检,跟外站存活巡检、死链巡检排在同一个任务里。频率一周一次就够,毕竟签发行为从发生到被利用通常还有几天到几周的窗口。
结果里该看什么
三类情况值得立刻查:
- 你不用的 CA。你一直用 Let's Encrypt,结果冒出一张某商业 CA 签的证书。crt.sh 里有签发者名称一列,一眼能看到。
- 你不认识的子域名。比如冒出来一个
vpn-old.example.com或者staging.example.com。这通常意味着被遗忘的基础设施还在跑,或者有人在搭影子环境。 - 你没申请过的通配符证书。
*.example.com是最严重的一档,一张误签的通配符覆盖你整个命名空间。
常见的签发路径
理解这些路径,比单纯盯着日志更有用:
- 悬挂 DNS 记录。你把某台云主机下线了,但 CNAME 还指着那个已经释放的地址。有人重新申请到那个资源,就能完成验证。
- 供应商迁移后的残留记录。合作结束后没清干净的 TXT 或者 CNAME。
- 前员工的 DNS 权限没回收。离职流程里最容易漏的一项。
- 短暂的 DNS 劫持。监控还没发现就已经被关掉了,但证书已经签出来了。
查到之后怎么办
按顺序来:
- 先确认是不是你自己或托管平台的正常签发。自动续期、CDN 的证书托管、多环境部署都会产生你不熟悉的记录,别急着判定为攻击。
- 确认是未授权签发后,联系签发 CA,让他们查是哪个账号或者哪个 ACME 订单发起的,并申请吊销。
- 轮换一切可能被用到的凭据:DNS 提供商账号、API key、服务器登录凭据。
- 把暴露的路径关掉:删悬挂记录、清残留 TXT、回收权限。
CAA 记录:从源头掐断
CT 监控是事后发现,CAA 是事前阻止。两条记录写进 DNS 就行:
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 iodef "mailto:security@example.com"
第一条限定只有指定的 CA 能给你签发,第二条告诉 CA 遇到违规签发请求时往哪儿报告。
两者不是替代关系。CAA 缩小了「谁能签发」的范围,CT 提醒你「有东西还是签出来了」——可能是 CA 的 bug,也可能是用了你允许的 CA 但账号被盗。两个都上。
顺带能做的事:盯仿冒域名
同一个查询换个对象,就能用来盯品牌仿冒。把你站名的常见变体(拼错、换后缀、加连字符)也丢进定期巡检,仿冒站通常在正式启用前几天就会去申请证书。这个窗口期内提交下架请求,比等它上线再处理要轻松。
一个容易忽略的副作用
CT 日志是公开的,这意味着你写进公开证书里的主机名也会被公开。如果你给内部系统(后台、数据库管理界面、内部工具)签了公开证书,那些内部主机名就进了公开日志,等于给扫描器递了一份资产清单。
不想被记录的内部名称,用通配符证书覆盖,或者干脆上私有 CA。
目录站的落地建议
把三件事做成一条流水线就行,不需要专门的安全团队:
- DNS 里配上 CAA,锁定你实际使用的 CA
- 每周跑一次 crt.sh 查询,结果跟上一周做 diff,只报新增
- 新增记录里出现「陌生 CA」「陌生子域名」「通配符」三种情况之一才告警,其余的归档
第三条很重要。不做过滤的话,自动续期产生的几十条记录会淹没真正有价值的告警,最后整个监控被人 mute 掉。