2. Sigstore核心组件:透明日志(Rekor)、证书颁发机构(Fulcio)、客户端工具(Cosign)

Sigstore 并非单一工具,而是一套由三个核心组件构成的开放签名基础设施。理解这三个组件的职责与协作关系,是掌握镜像供应链安全削峰机制的前提。透明日志(Rekor)提供不可篡改的审计轨迹,证书颁发机构(Fulcio)实现免密钥签名,客户端工具(Cosign)则是用户与基础设施交互的入口。

2.1 组件全景与协作流程

下图展示了 Sigstore 核心组件在镜像签名与验证流程中的协作关系:开发者通过 Cosign 发起签名请求,Fulcio 签发短期证书,签名记录最终被写入 Rekor 透明日志,供后续验证与审计。

Sigstore 核心组件协作架构图 Sigstore 核心组件协作流程 开发者 (Cosign 用户) Cosign 客户端工具 Fulcio 证书颁发机构 Rekor 透明日志 镜像仓库 OCI 制品 发起签名 请求证书 签发证书 写入签名记录 推送签名与镜像 验证者 查询/验证
关键设计理念:Sigstore 通过将证书签发与透明日志分离,实现了“免密钥”签名。开发者无需管理长期私钥,Fulcio 签发的证书有效期通常仅为 10 分钟,大幅降低了密钥泄露风险。

2.2 Rekor:透明日志与审计锚点

Rekor 是 Sigstore 的不可篡改审计日志,负责记录所有签名元数据。它基于 Merkle Tree 数据结构,提供以下核心能力:

  • 不可篡改性:每条记录通过哈希链与树根绑定,任何历史记录的修改都会导致根哈希不一致。
  • 可验证性:任何人可通过 Merkle 证明 验证某条签名记录是否存在于日志中,无需信任第三方。
  • 全局可见性:Rekor 实例(如公共实例 rekor.sigstore.dev)对所有参与者开放查询,形成公开审计轨迹。
Rekor 日志条目核心字段
字段 说明 示例值
UUID 日志条目的唯一标识符 24296fb24b8ad77a
Body 签名元数据(Base64 编码),包含签名、证书链、制品哈希 eyJhcGlWZXJzaW9uIjoiMC4wLjEifQ==
IntegratedTime 条目被写入日志的 Unix 时间戳 1697200000
LogIndex 条目在 Merkle Tree 中的顺序索引 1234567
Verification Merkle 证明,用于验证条目是否被包含在树中 SignedEntryTimestamp
冷启动削峰关联:在镜像大规模发布场景下,Rekor 的写入吞吐量可能成为瓶颈。理解其日志结构有助于设计批量提交策略,避免瞬时写入压力导致签名失败。

2.3 Fulcio:免密钥证书颁发机构

Fulcio 实现了 Sigstore 的核心理念——基于身份的短期证书。它不验证用户是否持有长期私钥,而是通过 OIDC(OpenID Connect)身份提供商(如 GitHub、Google、Microsoft)来确认用户身份。

证书签发流程

  1. 身份认证:开发者通过 Cosign 发起 OIDC 登录,获取身份令牌(ID )。
  2. 证书请求:Cosign 生成临时密钥对,将公钥与 ID 发送至 Fulcio。
  3. 证书签发:Fulcio 验证 ID 的签名与有效期,签发 X.509 证书,将用户身份信息嵌入证书的 Subject Alternative Name (SAN) 字段。
  4. 证书返回:Cosign 使用该证书对镜像进行签名,签名完成后证书即可丢弃。
Fulcio 证书关键属性
属性 值/说明
有效期 通常为 10 分钟,极短生命周期降低泄露影响
签发算法 ECDSA P-256
身份绑定 通过 SAN 扩展绑定 OIDC 身份(如 email:user@example.com)
证书链 由 Fulcio 根证书签发,验证者可通过 Fulcio 公钥链验证
注意:Fulcio 不存储私钥,也不管理证书吊销列表(CRL)。信任模型依赖于短期证书与透明日志的组合:即使证书被滥用,其短暂有效期和日志记录也能将风险窗口降至最低。

2.4 Cosign:客户端工具与签名操作

Cosign 是用户与 Sigstore 基础设施交互的命令行工具,支持容器镜像、Blob 文件、文档等多种制品的签名与验证。它封装了与 Fulcio、Rekor 的通信逻辑,提供简洁的接口。

核心命令与功能

  • cosign sign:对镜像或文件进行签名,自动触发 OIDC 认证与证书请求。
  • cosign verify:验证签名,自动查询 Rekor 日志确认签名记录存在。
  • cosign triangulate:根据镜像标签定位对应的签名镜像。
  • cosign attach:将签名附加到已有镜像,而非重新推送。

签名与验证示例

# 使用 Cosign 对镜像进行签名(自动触发 OIDC 与 Fulcio)
cosign sign --key "" ghcr.io/myorg/myapp:v1

# 验证镜像签名(自动查询 Rekor 日志)
cosign verify --key "" ghcr.io/myorg/myapp:v1

# 指定 Rekor 实例(私有部署场景)
cosign sign --rekor-url https://rekor.internal.example.com ghcr.io/myorg/myapp:v1
削峰实践:在 CI/CD 流水线中,可通过 --tlog-upload=false 参数临时跳过 Rekor 写入,先完成签名与推送,后续再通过 cosign attach tlog 批量补传日志,实现写入压力的削峰填谷。

2.5 组件对比与选型参考

Sigstore 核心组件对比
组件 职责 部署形态 冷启动削峰关注点
Rekor 透明日志,存储签名元数据 独立服务,支持私有部署 写入吞吐量、Merkle Tree 合并频率
Fulcio 基于 OIDC 的短期证书签发 独立服务,依赖 OIDC 提供商 证书签发延迟、OIDC 验证性能
Cosign 客户端签名/验证工具 CLI 工具,无状态 网络请求并发数、本地密钥管理