课题研究 域名数据与威胁监测 子课题02 · 第2页 / 共8页
02子课题 · 证书透明度日志监控

证书透明度日志监控第2页:CT技术体系、数据结构与标准演进

机制理解是监测工程的前提。本页系统拆解CT的技术底座:RFC 6962日志与Merkle树的防篡改原理、SCT的结构与三种交付方式、预证书(precertificate)机制及其造成的“双记录”数据形态、监控者与审计者两类角色的职责分界;随后梳理标准演进的三条主线——CT v2(RFC 9162)与Gossip(RFC 9163)的设计与现实、Static CT API静态架构对日志体系的彻底重构、以及Chrome/Apple/Firefox三家浏览器CT政策的具体差异。最后给出标准文件清单与版本引用纪律——在2026年的当下,区分“协议版本”与“实现架构”是避免研究失真的关键。

RFC 6962SCTPrecertificateSTHMMDRFC 9162GossipStatic CT APItiles
所属阶段域名数据与威胁监测 · 技术底座
目标受众检测工程师、威胁分析师、研究综述撰写者
关键输出机制认知框架 / 双协议采集需求 / 版本引用纪律

01 · 日志与Merkle树

CT日志是一个仅追加(append-only)的数据结构:所有证书条目按到达顺序排列,组织为Merkle哈希树。每个条目(叶子)是证书数据的哈希,相邻叶子两两哈希合并直至树根,树根连同树大小与时间戳由日志密钥签名为STH(Signed Tree Head)。Merkle树的密码学性质赋予CT三项核心能力:

  • 防篡改:任何对历史条目的修改都会改变根哈希,与已发布的STH冲突;
  • 收录证明(Inclusion Proof):日志可出具O(log n)大小的审计路径,证明某条目确实在该树中;
  • 一致性证明(Consistency Proof):证明新树是在旧树基础上追加而来、未篡改历史——这是"仅追加"承诺的密码学基础。
组件说明
叶子条目(Leaf Entry)两种类型:X509Entry(最终证书)与PrecertEntry(预证书),数据结构含MerkleTreeLeaf(版本、叶子类型、时间戳、条目数据哈希等)
STHtree_size(树大小)、timestamp(签发时间)、sha256_root_hash(根哈希)、tree_head_signature(日志私钥签名)
日志标识Log ID = 日志公钥的SHA-256哈希;浏览器与SCT中以此区分日志(RFC 6962日志)或以OID标识(CT v2日志)
MMD日志承诺的SCT兑现窗口:SCT时间戳起算,证书必须在该窗口内成为日志树的叶子。传统值为24小时;Chrome现行日志政策对新申请日志收紧为:RFC 6962日志≤4小时、静态日志≤1分钟
时间分片(Temporal Shard)浏览器要求日志按3—12个月的有效期窗口分片运营,日志名称中体现有效期(如Argon2026h2),到期即停止接收新条目——限制单份日志的历史负担

02 · 证书时间戳(SCT)机制

SCT(Signed Certificate Timestamp)是日志对"我已承诺在MMD内收录该证书"的签名承诺。RFC 6962 SCT结构为:version(v1)、log_id、timestamp、extensions、signature(签名覆盖日志ID、时间戳、扩展字段与叶子数据哈希)。

2.1 SCT的三种交付方式

交付方式机制适用性
嵌入证书CA将SCT列表写入最终证书的X.509v3扩展(OID 1.3.6.1.4.1.11129.2.4.2)主流方式,与传输无关
TLS扩展服务器在TLS握手signed_certificate_timestamp扩展中即时返回SCT需要服务器/前端支持
OCSP StaplingCA的OCSP响应中携带SCT,随证书状态一起装订返回早期过渡方案,现较少使用

浏览器连接站点时验证SCT:检查SCT签名有效性、时间戳合理性、日志是否在自身认可的日志列表中、数量是否满足政策要求。任一不满足即按证书错误处理(对不满足CT要求的证书降级或拒绝)。

对监测者的含义:SCT时间戳(timestamp字段)是"证书进入日志体系的时间"——通常略早于证书not_before签发时间。它比证书本身的签发时间更适合做时序分析(时区无关、以日志时钟为准),本课题所有时序规则(第4页§04)均建议以SCT/日志时间戳为基准。

03 · 预证书(Precertificate)机制

经典问题:CA若先签发最终证书再提交日志,则最终证书本身要先获得SCT才能签发——存在"先有鸡还是先有蛋"的循环。RFC 6962的解法是预证书(Precertificate):

  1. CA构造一份与最终证书几乎相同的TBSCertificate,但注入一个特殊的毒化扩展(CT Poison,OID 1.3.6.1.4.1.11129.2.4.3),使其永远无法作为有效证书被浏览器接受;
  2. CA用CT Precertificate Signing Certificate(专门的预签名证书,由CA证书签名)对毒化TBSCertificate签名,形成precertificate,通过add-pre-chain提交日志;
  3. 日志返回SCT,CA随后签发去掉毒化扩展的最终证书;
  4. 最终证书同样会被CA或日志抓取方提交日志(形成X509Entry),保证"最终证书必然可检索"。

因此同一次签发在日志中通常留下两条记录(PrecertEntry + X509Entry),precert的SCT时间戳通常比最终证书早数秒至数分钟。监测管道必须对二者去重归并,否则告警量与存储成本近乎翻倍(第3页§06)。CT v2(RFC 9162)对该机制进行了重构(见§05)。

04 · 监控者与审计者

RFC 6962定义了日志之外的两种客户端角色,本课题的监测管道本质上是"监控者"的工程实现:

角色目标关键操作
监控者发现可疑证书(针对特定域名/品牌的未授权证书、误签发)轮询get-sth/get-entries获取新条目;对条目做匹配与富化;保存证据
审计者验证日志按承诺运行(未分裂视图、未篡改、SCT兑现)验证STH签名;get-proof-by-hash验证收录;get-sth-consistency验证追加一致性;跨时间点复核

两类角色共享同一数据面,区别在于对数据的使用目的。工程实践中,同一份管道应同时承担监控职能,并对关键日志抽样执行审计职能(比对多个监控源的STH,可有效发现日志分裂视图——即不同客户端看到不同日志内容)。

RFC 6962 CT运行机制数据流
从证书提交到浏览器验证、监控/审计旁路的完整链路
数据来源:RFC 6962 §3—§4机制描述;本图为流程示意。

05 · CT v2(RFC 9162)与Gossip(RFC 9163)

2021年12月,IETF发布CT v2(RFC 9162),同时废黜(obsolete)RFC 6962;配套发布Gossip协议RFC 9163。CT v2的主要变化包括:

  • 统一叶子格式:叶子仅承载TBSCertificate(与传输方式无关),消除了v1中X509Entry/PrecertEntry双类型带来的冗余记录问题;
  • 预证书重构:precertificate改为CMS封装对象,不再使用CT Precertificate Signing Certificate与毒化扩展,CA提交流程简化;
  • 传输重构:引入TransItem通用结构承载SCT/SCT反馈等对象;TLS侧以transparency_info扩展替代signed_certificate_timestamp扩展;
  • 日志标识:日志以OID标识(区别于v1的公钥哈希Log ID)。

现实部署状况:CT v2未获产业界实际部署。公开讨论中(包括Let's Encrypt工程师在内的社区成员多次表态),生态对v2持观望态度,产业演进的实际重心转向Chrome主导、由Sunlight与Static CT API开创的静态日志路线(见§06、第7页)。Gossip(RFC 9163)旨在通过客户端间交换日志情报(SCT、STH签名等)检测日志合谋与分裂视图,同样未大规模落地——浏览器更多依赖自身日志列表与合规监测体系实现等效保障。

版本引用纪律:引用CT机制时必须区分"协议版本(RFC 6962 v1 / RFC 9162 v2)"与"实现架构(动态日志 / 静态日志)"两个维度:截至2026年,全球生产环境中的CT日志绝大部分仍是RFC 6962协议,但其中新增日志正快速转向静态架构;RFC 9162定义的v2协议几无生产部署。混用二者将造成研究结论失真。

06 · Static CT API与日志架构现代化

传统RFC 6962日志是"有状态"服务:维护动态Merkle树、处理并发追加、承诺MMD窗口,运维复杂度高(分片数据库可达数TB级),且MMD违约将导致日志被浏览器列表移除。2023年起,Chrome日志政策开始接受一种新的静态架构——Static CT API(现由C2SP组织标准化,前身即Let's Encrypt与Filippo Valsorda合作发布的Sunlight API),其核心设计:

维度RFC 6962动态日志Static CT静态日志
数据组织动态Merkle树,get-entries按索引拉取静态分片tiles(每片固定256条)+ checkpoint签名锚点,纯静态文件分发
收录承诺SCT先签发,条目在MMD(≤24h,新政策≤4h)内合入先排序落片、后签发SCT;SCT携带leaf_index扩展,收录即时可见(有效MMD趋近于零,Chrome政策要求≤1分钟)
提交接口add-chain / add-pre-chain / get-roots保持RFC 6962兼容(同一套提交端点),写路径不变、读路径重构
基础设施有状态服务集群 + 大容量数据库对象存储/CDN直接承载只读数据,扩容与容灾极简
对监控者影响按游标顺序拉取即可需实现tiles/checkpoint抓取与增量diff(详见第3页§03、第7页§02)

2025—2026年是静态化的落地高峰:Let's Encrypt基于Sunlight构建的生产日志Sycamore与Willow于2025年11月获得Chrome日志列表准入资格,其全部RFC 6962日志已于2025年11月30日转为只读、2026年2月28日停止服务;Cloudflare、Google(Trillian Tessera)、IPng等亦推出静态实现。监测管道必须在RFC 6962与Static CT双协议下同时采集——这是第3页的核心工程命题。

07 · 浏览器CT政策对比

浏览器强制起点SCT数量要求(概要)日志列表
Chrome2018-04-30后签发的所有公开信任TLS证书现行政策:至少1个来自"当前获批日志"的SCT;按证书有效期细分:≤180天需2个来自"曾获批日志"的SCT;>180天需3个;经TLS扩展或OCSP交付时另需覆盖Google与非Google日志各一Google日志列表(运营方申请+合规监测)
Apple(Safari等)2021-10-15后签发的证书至少2个SCT;≤180天:2个来自不同日志(同一运营方最多1个);181—398天:3个(同一运营方最多2个);且至少1个SCT来自符合RFC 6962的日志Apple独立日志列表
Firefox桌面v135(2025-02-04)、Android v145(2025-11-11)起验证SCT有效性并检查日志信任状态Mozilla根证书计划+CT生态

注:上表为政策要点归纳,细则(含EV证书历史要求、过渡期安排)以各官方政策页为准:Chrome CT Policy(github.com/GoogleChrome/CertificateTransparency)、Apple支持文档103214。

7.1 日志列表治理对监测的意义

  • 覆盖基线:监测范围应等于 Chrome日志列表 ∪ Apple日志列表 中的活跃日志——两份列表有交集但互不替代(例如历史上曾出现仅被一方认可的日志)。
  • 分片到期:日志按时间分片到期停收新条目,管道须跟踪日志列表变更(新增/到期/移除),避免采集中断产生盲区。
  • 合规威慑:日志可用性低于99%、MMD违约、密钥管理违规均会导致日志被移除——这保证了日志数据的整体可信度,也是"审计者"职能的现实依托。

08 · 标准与政策文件清单

文件发布时间定位
RFC 6962 Certificate Transparency2013-06CT v1协议:日志、SCT、Merkle树、precertificate
RFC 8555 ACME2019-03证书自动化签发协议(监测管道理解"证书为何海量"的背景)
RFC 9162 CT Version 2.02021-12CT v2协议(废黜RFC 6962;实际部署有限)
RFC 9163 Gossiping in CT2021-12去中心化日志情报交换协议(未大规模部署)
C2SP static-ct-api2023起迭代静态CT架构规范(v1.1.0为Chrome政策接受版本);配套tlog-tiles监控分片规范
Chrome CT Policy / Log Policy持续更新SCT验证要求与日志准入/合规政策
Apple CT Policy持续更新SCT数量与日志列表要求(支持文档103214)

本节参考来源(第2页)

本节机制性内容全部对应RFC/规范原文;政策类内容以浏览器官方页面为准。

[1]

IETF RFC 6962《Certificate Transparency》:rfc-editor.org/rfc/rfc6962。§01—§03全部机制性表述的出处。

[2]

IETF RFC 9162《Certificate Transparency Version 2.0》(2021-12,废黜RFC 6962):rfc-editor.org/rfc/rfc9162;RFC 9163《Gossiping in Certificate Transparency》:rfc-editor.org/rfc/rfc9163。

[3]

C2SP《Static CT API》规范(v1.1.0,含tlog-tiles监控分片规范):c2sp.org/static-ct-api、c2sp.org/tlog-tiles。§06的技术细节出处。

[4]

Chrome CT Log Policy(新日志准入政策,含MMD要求与静态API准入):googlechrome.github.io/CertificateTransparency/log_policy.html。

[5]

Chrome CT Policy v1.1(SCT数量要求细则):github.com/GoogleChrome/CertificateTransparency/ct_policy.md。

[6]

Apple《Certificate Transparency policy》:support.apple.com/en-us/103214(页面更新于2025年4月)。

[7]

MDN Web Docs《Certificate Transparency》词条(浏览器CT验证行为汇总):developer.mozilla.org。

[8]

Let's Encrypt《Introducing Sunlight, an open source CT log implementation》(2024-03-14):letsencrypt.org/2024/03/14/introducing-sunlight;CT v2部署现状的社区权威表态(Let's Encrypt工程师Matthew McPherrin确认:无任何CT v2实现、无人运行v2日志,Sunlight是基于v1的演进):community.letsencrypt.org/t/218492;LE RFC 6962日志EOL的官方社区公告(含EOL计划原文链接;只读2025-11-30生效确认):community.letsencrypt.org/t/243769。

[9]

Google开源透明数据基础设施Trillian:github.com/google/trillian;透明日志生态awesome-transparency:github.com/C2SP/awesome-transparency。

[10]

CT社区站点:certificate.transparency.dev。