2. Sigstore 核心组件:Cosign、Fulcio、Rekor、Gitsign 的架构与职责

Sigstore 并非单一工具,而是一套由多个开源组件构成的 无中心化软件签名与验证基础设施。其设计目标是消除传统 PKI 和密钥管理的复杂性,让开发者能够以极低门槛对构建产物(容器镜像、二进制文件、SBOM 等)进行签名,并让消费者能够验证产物的来源与完整性。

本章将深入剖析 Sigstore 生态中的四个核心组件:Cosign(签名/验证客户端)、Fulcio(短期证书颁发机构)、Rekor(透明性日志)和 Gitsign(Git 提交签名工具)。理解它们的架构与职责,是后续进行接口调用和实战集成的基础。

2.1 组件全景与协作关系

在典型的 Sigstore 签名流程中,四个组件协同工作,形成一个完整的信任链。下图展示了它们之间的核心交互关系:

Sigstore 核心组件协作架构图 开发者 (OIDC 身份) Cosign 签名 / 验证客户端 Fulcio 短期证书 CA Rekor 透明性日志 镜像仓库 (OCI 制品存储) 消费者 (验证方) 发起签名 请求证书 返回证书 上传签名条目 推送签名 拉取镜像+签名 查询透明性日志 核心流程说明: 1. 开发者通过 Cosign 发起签名 → 2. Cosign 向 Fulcio 请求基于 OIDC 身份的短期证书 → 3. 签名和证书上传至 Rekor 日志 → 4. 签名产物推送至镜像仓库 → 5. 消费者拉取产物并查询 Rekor 验证签名
关键设计理念:Sigstore 通过将信任从长期密钥转移到短期证书和透明性日志,消除了密钥管理的痛点。开发者无需再担心私钥泄露或轮换问题。

2.2 Cosign:签名与验证的客户端主力

Cosign 是 Sigstore 项目中最广为人知的命令行工具和库,也是整个生态的 用户入口。它负责执行实际的签名生成、签名验证以及签名与 OCI 制品的关联操作。

2.2.1 核心职责

  • 容器镜像签名:对 Docker/OCI 镜像进行签名,并将签名作为镜像标签或 OCI 制品附件存储。
  • 任意文件签名:支持对二进制文件、文本文件、SBOM、软件包等任意 blob 进行签名。
  • 密钥管理:支持本地密钥对、云 KMS(AWS KMS、Azure Key Vault、GCP KMS)、硬件安全模块(HSM)以及 Sigstore 的 密钥无感模式(通过 Fulcio 获取短期证书)。
  • 验证策略:提供丰富的验证选项,包括验证签名者身份、证书链、透明性日志包含证明等。
  • OCI 操作:直接与 OCI 兼容的镜像仓库交互,实现签名和附件的推送与拉取。

2.2.2 架构特点

Cosign 采用 插件化架构,其核心签名逻辑与具体的存储后端(OCI 仓库、文件系统)解耦。它通过标准输入输出和 OCI 分发规范与外部系统交互。在密钥无感模式下,Cosign 内部会生成一个临时密钥对,私钥仅存在于内存中,签名完成后立即销毁。

实战要点:Cosign 的 cosign sign 和 cosign verify 命令是日常使用频率最高的接口。在 CI/CD 流水线中,通常使用 cosign verify-attestation 来验证 SBOM 或 SLSA 证明。

2.3 Fulcio:基于 OIDC 的短期证书颁发机构

Fulcio 是 Sigstore 的 证书颁发机构(CA),它解决了传统签名中“如何安全分发公钥”的难题。Fulcio 不验证用户的长期密钥,而是验证用户的 OIDC 身份(如 Google、GitHub、Microsoft 账号)。

2.3.1 核心职责

  • 身份绑定:接收来自 Cosign 的证书签名请求(CSR),验证其中携带的 OIDC 令牌。
  • 短期证书签发:签发有效期极短(通常为 10 分钟)的 X.509 证书,证书主体信息(Subject)直接映射自 OIDC 身份(如 email 地址)。
  • 证书链构建:Fulcio 自身拥有根 CA 证书,签发的证书会形成完整的证书链,便于验证方追溯信任根。
  • 审计日志:所有证书签发操作均可被记录和审计。

2.3.2 架构特点

Fulcio 是一个 无状态服务,它不存储任何用户密钥或长期状态。其核心安全假设是:信任 OIDC 提供商的身份验证结果。Fulcio 的根证书是公开的,任何人都可以获取并用于验证。

特性 传统 CA Fulcio
身份验证方式 企业 LDAP、预共享密钥 OIDC 联邦(GitHub、Google 等)
证书有效期 数月到数年 数分钟(通常 10 分钟)
私钥管理 用户自行保管长期私钥 无需管理,临时密钥对即时生成
吊销机制 CRL / OCSP 依赖短期有效期,无需主动吊销
安全边界:Fulcio 的安全性高度依赖 OIDC 提供商的安全性。如果攻击者能够劫持开发者的 OIDC 会话,就可以冒充其身份获取证书。因此,建议启用 OIDC 的多因素认证(MFA)。

2.4 Rekor:不可篡改的透明性日志

Rekor 是 Sigstore 的 透明性日志(Transparency Log),它充当了一个公开、可追加、不可篡改的账本,用于记录所有签名元数据。Rekor 是 Sigstore 信任模型的核心支柱,它使得任何人都可以独立验证签名是否在特定时间点存在。

2.4.1 核心职责

  • 签名记录存储:接收来自 Cosign 的签名条目(包含签名本身、证书、制品哈希等),并将其永久存储在 Merkle 树中。
  • Merkle 树证明:为每个条目生成 Merkle 树包含证明(Inclusion Proof),证明该条目确实存在于日志中。
  • 一致性证明:提供日志一致性证明(Consistency Proof),确保日志未被篡改或分叉。
  • 搜索与查询:支持通过制品哈希、证书指纹、OIDC 身份等字段搜索历史签名记录。

2.4.2 架构特点

Rekor 使用 Trillian 作为其 Merkle 树实现后端,Trillian 提供了可扩展的、基于 Google Certificate Transparency 技术的日志存储。Rekor 本身是一个 gRPC/REST 服务,对外提供 API 接口供 Cosign 和其他客户端调用。

# 使用 rekor-cli 查询特定镜像摘要的签名记录
rekor-cli search --sha 256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890

# 输出示例(简化)
Found matching entries:
- UUID: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
- Subject: [sha256:abcdef...] (container image)
- IntegratedTime: 2024-01-15T10:30:00Z
- LogIndex: 12345
信任模型:Rekor 的公开性意味着任何人都可以写入和读取。签名者通过将签名发布到 Rekor,向全世界证明“我在这个时间点签名了这个制品”。验证者通过查询 Rekor 来确认签名确实存在且未被提前撤销。

2.5 Gitsign:Git 提交的密钥无感签名

Gitsign 是 Sigstore 生态中专为 Git 提交签名 设计的工具。它将 Sigstore 的密钥无感签名模式引入 Git 工作流,让开发者无需配置 GPG 密钥即可对 Git 提交进行签名和验证。

2.5.1 核心职责

  • Git 提交签名:作为 Git 的 gpg.format 后端,拦截 git commit 操作,自动使用 Sigstore 流程对提交内容进行签名。
  • OIDC 身份绑定:在签名过程中,Gitsign 会触发 OIDC 登录流程,将提交者的身份(如 GitHub 账号)绑定到提交签名上。
  • 透明性日志集成:签名后的提交证书和签名数据会自动上传至 Rekor 日志,形成公开可查的审计记录。
  • 验证支持:配合 git verify-commit 或 cosign verify 命令,验证 Git 提交的签名有效性。

2.5.2 架构特点

Gitsign 本质上是一个 Git 签名后端适配器。它通过 Git 的 gpg.program 配置项,将 Git 的签名请求转发给 Sigstore 的 Cosign 和 Fulcio 组件。Gitsign 本身不实现 CA 或日志功能,而是完全复用 Sigstore 的现有基础设施。

Gitsign 签名流程 git commit Gitsign Sigstore 基础设施 Cosign + Fulcio + Rekor 远程仓库 调用 签名请求 推送签名提交 Gitsign 将 Git 的签名操作透明地映射到 Sigstore 的密钥无感签名流程,开发者只需一次 OIDC 登录即可完成提交签名。

2.6 组件职责对比总结

组件 核心职责 输入 输出 关键接口
Cosign 签名生成与验证、OCI 制品操作 制品文件、OIDC 令牌、密钥 签名、签名附件、验证结果 cosign sign, cosign verify
Fulcio 基于 OIDC 的短期证书签发 CSR、OIDC 令牌 X.509 短期证书 gRPC CreateCertificate
Rekor 透明性日志存储与查询 签名条目(签名+证书+哈希) Merkle 树包含证明、日志条目 REST /api/v1/log/entries
Gitsign Git 提交的密钥无感签名 Git 提交内容、OIDC 令牌 签名后的 Git 提交 Git gpg.program 适配
架构总结:Cosign 是执行者,Fulcio 是身份背书者,Rekor 是公证人,Gitsign 是 Git 场景的适配器。四者共同构建了一个从“开发者身份”到“制品签名”再到“公开审计”的完整信任链。在后续章节中,我们将通过具体的 API 调用和代码示例,演示如何在实际系统中集成这些组件。