3. Sigstore全景:Cosign、Fulcio、Rekor、Certificate Transparency生态组件

Sigstore 是一套面向软件供应链的签名与验证框架,旨在解决“谁来签、怎么签、签完存在哪、如何验证”四个核心问题。它并非单一工具,而是由多个组件构成的开放生态。理解每个组件的职责与交互关系,是调优 OCI 分发集成的前提。

3.1 核心组件总览

Sigstore 生态包含四个关键组件,分别对应签名、证书、日志和透明性校验。下表列出各组件的定位与核心产出物:

组件 角色 核心产出物 与OCI分发的关系
Cosign 签名客户端 镜像签名、SBOM 签名、 attestation 直接操作 OCI 制品,将签名附加到镜像仓库
Fulcio 证书颁发机构(CA) 短期代码签名证书(X.509) 为 Cosign 提供 OIDC 身份绑定的证书
Rekor 透明性日志 签名元数据的不可变记录(条目) 存储签名与镜像摘要的映射关系
Certificate Transparency (CT) 证书日志 Fulcio 签发证书的审计日志 确保 Fulcio 行为可审计,防止恶意签发
关键理解: Cosign 是“执行者”,Fulcio 是“身份担保人”,Rekor 是“公证人”,CT 是“监督者”。四者共同构成从身份到签名的完整信任链。

3.2 组件交互流程与信任链

一次完整的 Sigstore 签名流程涉及所有组件协同工作。下图展示了从开发者签名到验证者校验的端到端数据流:

Sigstore 组件交互与信任链流程图 Sigstore 组件交互与信任链 开发者 OIDC 身份 Cosign 签名客户端 Fulcio 证书颁发机构 Rekor 透明性日志 OCI 镜像仓库 镜像 + 签名 + attestation 验证者 策略引擎 CT 日志 证书透明性 请求签名 请求证书 返回短期证书 上传签名元数据 推送签名 拉取镜像+签名 查询日志 提交证书 校验证书 信任链核心:OIDC 身份 → Fulcio 证书 → Cosign 签名 → Rekor 日志 → 验证者策略
流程说明: 开发者通过 Cosign 发起签名请求 → Cosign 向 Fulcio 申请短期证书(基于 OIDC 身份)→ Fulcio 将证书提交到 CT 日志 → Cosign 使用证书签名镜像,并将签名推送到 OCI 仓库,同时将签名元数据上传到 Rekor → 验证者从 OCI 仓库拉取镜像和签名,从 Rekor 查询日志,并可选择从 CT 日志校验证书有效性。

3.3 组件深度解析

3.3.1 Cosign:签名与验证的执行者

Cosign 是 Sigstore 的命令行工具和库,直接与 OCI 分发规范交互。它支持以下核心操作:

  • 镜像签名: 使用私钥或 Fulcio 颁发的短期证书对容器镜像进行签名,签名作为 OCI 制品存储在镜像仓库中。
  • 签名验证: 从仓库拉取签名,结合 Rekor 日志和公钥/证书进行验证。
  • Attestation 管理: 支持生成和验证 SBOM、SLSA 等 in-toto attestation。
  • 密钥管理: 支持本地密钥、KMS、硬件安全模块(HSM)等多种密钥后端。
调优注意: Cosign 默认将签名存储在 sha256-<digest>.sig 的 OCI 制品中。在 OCI 分发集成调优时,需关注签名存储的命名规范、仓库权限和并发写入性能。

3.3.2 Fulcio:基于 OIDC 的证书颁发机构

Fulcio 实现了“无密钥签名”的核心机制。它通过 OIDC 协议与身份提供商(如 GitHub、Google、Microsoft)集成,为开发者签发短期 X.509 证书。

特性 说明 调优影响
证书有效期 通常为 10 分钟 减少证书泄露风险,但要求签名流程必须快速完成
身份绑定 证书 Subject 包含 OIDC 身份信息(如 email) 验证者可通过证书直接追溯签名者身份
CT 集成 所有签发的证书必须提交到 CT 日志 增加证书签发的延迟,但提供透明性保证
部署模式 公共实例(sigstore.dev)或私有部署 私有部署需自行管理 OIDC 信任和 CT 日志

3.3.3 Rekor:不可变签名日志

Rekor 是一个基于 Merkle 树的透明性日志,用于存储签名元数据。每个日志条目包含签名、证书、镜像摘要和可选的自定义数据。

  • 条目结构: 每个条目由 body(签名元数据)、integratedTime(提交时间)、logIndex(日志索引)组成。
  • 查询方式: 支持按 logIndex、uuid、publicKey、email 等字段查询。
  • 验证能力: 验证者可通过 Rekor 的 Merkle 树证明(inclusion proof)确认签名在特定时间点存在。
性能考量: 公共 Rekor 实例(sigstore.dev)的日志写入可能存在延迟。在 CI/CD 流水线中,建议使用异步写入或配置超时重试策略,避免签名流程阻塞。

3.3.4 Certificate Transparency:证书审计层

CT 日志是 Fulcio 信任模型的基础。它确保所有由 Fulcio 签发的证书都被公开记录,防止 CA 被攻破后恶意签发证书而不被发现。

CT 在 Sigstore 中的角色:

  • 强制提交: Fulcio 在签发证书后,必须将证书提交到 CT 日志并获得 Signed Certificate Timestamp (SCT)。
  • 验证者校验: 验证者在验证签名时,可以选择校验证书是否包含有效的 SCT,确保证书已被 CT 日志记录。
  • 审计能力: 任何人都可以监控 CT 日志,发现异常证书签发行为。

3.4 组件部署与集成模式

根据组织的安全需求和基础设施,Sigstore 组件可以采用不同的部署模式:

Sigstore 部署模式对比图 Sigstore 部署模式对比 模式一:全公共 使用 sigstore.dev 公共实例 • Cosign → 公共 Fulcio • 签名 → 公共 Rekor • 证书 → 公共 CT 日志 优点:零运维,快速上手 缺点:依赖外部服务 适用:开源项目、小团队 模式二:混合部署 私有 Cosign + 公共日志 • 私有 Cosign 配置 • 公共 Fulcio + Rekor • 私有 OCI 仓库 优点:平衡控制与成本 缺点:日志延迟不可控 适用:中型企业、CI/CD 模式三:全私有 自建全部组件 • 私有 Fulcio 实例 • 私有 Rekor 实例 • 私有 CT 日志 优点:完全控制、低延迟 缺点:运维成本高 适用:大型企业、合规要求

3.5 组件调优关键点

在 OCI 分发集成场景下,各组件的调优直接影响签名和验证的性能与可靠性:

组件 调优维度 推荐配置 影响
Cosign 签名并发数 根据镜像大小调整 --max-workers 减少大规模镜像签名的时间
Cosign 密钥缓存 启用 --kms-cache 或本地密钥环 避免重复请求 KMS,降低延迟
Fulcio 证书缓存 配置证书缓存 TTL(建议 5 分钟) 减少 OIDC 交互次数
Rekor 日志写入超时 设置 --timeout 30s 避免签名流程因日志延迟而阻塞
Rekor 查询索引 启用 --enable-retrieve-api 加速验证阶段的日志查询
CT 日志 提交策略 异步提交,允许签名流程不等待 SCT 提升签名速度,但降低即时验证能力
调优原则: 在保证安全性的前提下,通过缓存、超时控制和异步策略减少组件间的同步等待。对于私有部署,建议将 Rekor 和 Fulcio 部署在同一网络区域,降低网络延迟。

3.6 组件版本与兼容性

Sigstore 组件仍在快速迭代中。下表列出当前主流版本及关键兼容性信息:

组件 当前稳定版 OCI 分发支持 备注
Cosign v2.2.x 完整支持 OCI 1.1 推荐使用 v2.x,v1.x 已停止维护
Fulcio v1.6.x 不直接操作 OCI 需与 OIDC 提供商版本匹配
Rekor v1.3.x 不直接操作 OCI 支持 PostgreSQL 和 MySQL 后端
CT 日志 v1.0.x 不直接操作 OCI 通常与 Fulcio 一起部署
版本兼容性提示: 在集成调优前,务必确认 Cosign 版本与 OCI 仓库的 API 版本兼容。Cosign v2.x 要求 OCI 仓库支持 Referrers API(OCI 1.1),否则需使用 --registry-referrers-mode=oci-fallback 降级模式。