证书透明度(CT)日志与国密 PKI:如何在国密体系中构建可信的证书审计机制

PKI 体系 · 2026-06-03 · 6 阅读

引言:为什么 PKI 需要"透明度"?

2011年,荷兰 CA DigiNotar 被黑客入侵,攻击者利用其根证书签发了超过500张伪造证书,包括 *.google.com 的通配符证书。这些伪造证书被用于对伊朗用户进行中间人攻击。事件最终导致 DigiNotar 破产,但暴露的问题远超一家公司的存亡——整个 PKI 体系的信任模型存在结构性缺陷

问题的核心在于:在传统的 PKI 体系中,CA 签发的证书对公众是不透明的。任何 CA 都可以为任意域名签发证书,而域名所有者可能完全不知情。

2013年,Google 提出了证书透明度(Certificate Transparency,CT)方案,旨在通过公开日志的方式,让所有证书的签发行为都可被审计。如今,CT 已成为浏览器信任证书的硬性要求——Chrome 要求所有2018年4月后签发的证书必须在 CT 日志中有记录。

但在国密 PKI 体系中,CT 的落地仍然是一个鲜有人讨论的话题。本文试图回答一个关键问题:如何在国密 PKI 体系中构建可信的证书审计机制?

一、CT 日志工作原理回顾

1.1 核心概念

CT 的核心思想很简单:所有证书必须记录在公开、不可篡改的日志中,任何人都可以查询和审计。

CT 日志是一个默克尔树(Merkle Tree)结构的仅追加(append-only)数据结构:

CODE
Root Hash
               /         \
          Hash(0-1)    Hash(2-3)
          /     \       /     \
       Hash(0) Hash(1) Hash(2) Hash(3)
         |       |       |       |
       Cert0   Cert1   Cert2   Cert3

关键特性:

  • 仅追加:只能添加新证书,不能修改或删除已有记录
  • 不可篡改:任何对历史记录的修改都会导致根哈希变化
  • 可验证:任何人都可以验证某条证书是否在日志中,以及日志是否被篡改

1.2 CT 生态系统的角色

角色职责实例
CA(证书颁发机构)签发证书并提交到 CT 日志CFCA、沃通、数安时代
CT Log(日志服务器)存储证书,提供 SCTGoogle Argon、Cloudflare Nimbus
Monitor(监控者)监控日志,发现异常证书Facebook CT Monitor
Auditor(审计者)验证日志的一致性独立第三方
浏览器/客户端验证 SCT,拒绝无 CT 记录的证书Chrome、Firefox

1.3 SCT:签名的时间戳证明

当 CA 将证书提交到 CT 日志后,日志服务器会返回一个 SCT(Signed Certificate Timestamp),包含:

JSON
{
  "sct_version": 1,
  "id": "CT Log ID (SHA-256 of Log's public key)",
  "timestamp": 1700000000000,
  "extensions": "",
  "signature": "signature over (version, timestamp, type, certificate_data)"
}
}

SCT 是日志服务器对"我已收到此证书"的签名承诺。浏览器在验证证书时,会检查是否存在有效的 SCT。

二、国密 PKI 体系中的 CT 需求

2.1 为什么国密 PKI 也需要 CT?

有人认为,国密 PKI 体系主要由政府和企业内部 CA 使用,不像公开互联网 PKI 那样面临恶意 CA 的威胁。这种观点存在以下问题:

第一,内部 CA 同样存在滥发风险。 企业内部 CA 的管理员可能出于测试、便利甚至恶意目的签发不合规的证书。没有透明审计机制,这些行为很难被发现。

第二,国密 HTTPS 的推广需要浏览器信任。 随着国密浏览器(如360安全浏览器、奇安信浏览器)的普及,国密证书也需要像国际证书一样接受透明度审计。

第三,合规要求。 《密码法》和《关键信息基础设施安全保护条例》要求密码应用具备可审计性。CT 是实现证书签发可审计的技术手段。

2.2 国密 CT 的技术挑战

将 CT 应用到国密 PKI 体系,面临以下技术挑战:

挑战一:算法替换

原始 CT 协议(RFC 6962)使用 SHA-256 作为默克尔树的哈希算法,ECDSA 作为签名算法。国密体系需要替换为 SM3 和 SM2:

组件国际算法国密算法
默克尔树哈希SHA-256SM3
日志服务器签名ECDSA (P-256) + SHA-256SM2 + SM3(遵循 GM/T 0003-2012)
SCT 签名ECDSASM2
证书指纹SHA-256SM3(遵循 GM/T 0004-2012)
挑战二:时间戳算法

SCT 中的签名需要使用 SM2-with-SM3 算法。SM2 签名的输入格式与 ECDSA 不同(SM2 使用 Z 值,即用户标识和公钥的哈希),需要确保日志服务器和客户端都支持。

挑战三:浏览器/客户端支持

国密浏览器需要支持验证 SM2 签名的 SCT,这涉及到 TLS 扩展和证书验证逻辑的修改。

2.3 国密 CT 的技术方案

完整的国密 CT 方案需要以下改造:

#### 默克尔树改造

PYTHON
# 国际 CT 的默克尔树节点哈希
def merkle_hash(left, right):
    return sha256(b'\x01' + left + right).digest()

# 国密 CT 的默克尔树节点哈希
def gm_merkle_hash(left, right):
    return sm3_hash(b'\x01' + left + right)

# 叶子节点哈希
def leaf_hash(cert_data):
    return sm3_hash(b'\x00' + cert_data)

#### SCT 签名的改造

三、搭建国密 CT 日志服务器

3.1 基于 Trillian 的国密改造

Google 的 Trillian 是 CT 日志服务器的基础框架,支持自定义密码算法。以下是改造步骤:

步骤一:部署 Trillian 基础服务

步骤二:替换密码算法

Trillian 的密码算法通过 crypto 包抽象,需要实现 SM2/SM3 的 VerifierSigner 接口:

步骤三:生成日志服务器的 SM2 密钥对

3.2 最小化部署方案

如果不需要完整的 Trillian 部署,可以使用简化的 CT 日志方案:

四、国密证书的 CT 验证

4.1 验证流程

国密浏览器验证 SM2 证书的 CT 合规性,流程如下:

CODE
1. 接收服务器证书链
2. 检查证书中是否包含 SCT(通过 TLS 扩展或 OCSP Stapling)
3. 使用 CT 日志服务器的 SM2 公钥验证 SCT 签名
4. 验证 SCT 中的证书指纹与实际证书匹配
5. 可选:验证证书在默克尔树中的包含性(审计路径验证)

4.2 SCT 验证代码

五、国密 CT 的实践建议

5.1 企业内部 PKI 的 CT 部署

对于企业内部 PKI,建议采用以下架构:

部署要点:

  • CT 日志服务器应部署在独立的网络区域,与 CA 物理隔离
  • 日志数据应定期备份,防止数据丢失
  • Monitor 服务应配置告警规则,监控异常证书签发
  • 审计日志应保留至少 5 年

5.2 与现有国际 CT 的兼容

在过渡期,企业可能同时运行国际算法和国密算法两套 PKI。建议:

  • 独立日志:国密证书和国际证书分别提交到不同的 CT 日志
  • 统一监控:Monitor 服务同时监控两套日志,统一告警
  • 浏览器适配:国密浏览器验证国密 CT,国际浏览器验证国际 CT

5.3 性能考虑

CT 日志的性能瓶颈主要在写入(签名)和读取(审计路径计算):

操作国际 CT (ECDSA+SHA-256)国密 CT (SM2+SM3)
叶子哈希~1μs~3μs
SCT 签名~2ms~5ms
审计路径验证~0.1ms/层~0.3ms/层
SM2 签名比 ECDSA 慢约 2-3 倍,但对于 CT 日志这种低频写入场景,性能差异可以接受。

六、总结

证书透明度是 PKI 体系信任链的重要一环。在国密 PKI 体系中构建 CT 机制,需要:

  • 算法替换:将 SHA-256 替换为 SM3,ECDSA 替换为 SM2
  • 协议适配:SCT 格式和签名算法需要适配国密标准
  • 基础设施:部署国密 CT 日志服务器、Monitor 和 Auditor
  • 客户端支持:国密浏览器需要支持 SM2 签名的 SCT 验证
虽然国密 CT 的落地还面临生态不完善、工具链缺乏等挑战,但随着国密 HTTPS 的推广和密评要求的细化,CT 在国密 PKI 中的应用只是时间问题。提前布局,才能在合规浪潮中占据主动。


*参考资料:*

  • *RFC 6962 - Certificate Transparency*
  • *RFC 9162 - Certificate Transparency Version 2.0*
  • *GM/T 0003-2012 - SM2 椭圆曲线公钥密码算法*
  • *GM/T 0004-2012 - SM3 密码杂凑算法*
  • *Google Trillian: https://github.com/google/trillian*
  • *Certificate Transparency 中文社区: https://ct.fly.dev*