2、Sigstore核心组件解析:Cosign、Fulcio、Rekor、TUF的架构与功能

Sigstore 并非单一工具,而是一套由多个开源组件构成的云原生签名基础设施。其核心设计目标是消除传统密钥管理痛点,为软件供应链提供“开箱即用”的代码签名与验证能力。本章深入解析四大核心组件:Cosign(签名与验证客户端)、Fulcio(短期证书颁发机构)、Rekor(透明性日志)以及 TUF(更新框架)的架构设计与功能职责。

核心认知:Sigstore 通过“签名-证书-日志-分发”四层解耦,实现了无需管理长期私钥、可审计、可复现的镜像签名体系。理解这四者的协作关系,是后续进行容量水位巡检与故障定位的基础。

2.1 组件全景与协作流程

在镜像供应链场景中,一次典型的 Sigstore 签名流程涉及所有核心组件。下图展示了从开发者签名到运维验证的完整链路:

Sigstore 核心组件协作流程图(镜像签名场景) 开发者环境 Cosign CLI 签名 / 验证 / 附加 镜像仓库 存储镜像 + 签名 Sigstore 基础设施 Fulcio 短期证书颁发 (CA) Rekor 透明性日志 验证环境 策略引擎 Kyverno / OPA TUF 客户端 安全分发根信任 请求证书 记录签名 推送签名 拉取镜像 + 签名 查询日志 分发根信任 流程:开发者使用 Cosign 通过 OIDC 身份向 Fulcio 申请短期证书 → 签名镜像 → 将签名记录写入 Rekor → 推送签名至镜像仓库 验证方:拉取镜像与签名 → 查询 Rekor 验证透明性 → 通过 TUF 获取根信任 → 策略引擎执行准入控制

2.2 Cosign:签名与验证的客户端核心

Cosign 是 Sigstore 生态中使用最广泛的命令行工具与库,负责镜像签名的生成、附加、验证与发现。它直接与 OCI 镜像仓库交互,支持多种签名策略。

功能维度 说明 关键命令/参数
镜像签名 使用私钥或通过 Fulcio 获取的短期证书对镜像摘要进行签名 cosign sign
签名验证 验证镜像签名是否有效、证书链是否可信、是否在 Rekor 中有记录 cosign verify
附加元数据 将 SBOM、Attestation(SLSA 证明)等附加到镜像 cosign attach
密钥管理 支持本地密钥对、KMS(AWS/GCP/Azure)、硬件安全模块 cosign generate-key-pair
OCI 仓库交互 通过 OCI 分发规范将签名作为独立层或标签存储 cosign copy / cosign triangulate
容量水位巡检关注点:Cosign 在签名和验证过程中会频繁与镜像仓库、Fulcio、Rekor 进行 HTTP 通信。当并发签名请求量激增时,Cosign 客户端的连接池耗尽、OIDC 刷新失败、Rekor 写入超时是常见的故障模式。巡检时应关注 cosign verify 的响应延迟和错误率。

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

Fulcio 是 Sigstore 的证书颁发机构(CA),它消除了传统 PKI 中管理长期根证书和私钥的复杂性。Fulcio 的核心创新在于:不验证用户身份,而是验证用户的 OIDC 身份。

  • 架构原理:Fulcio 作为 OIDC 的 Relying Party,接收来自 GitHub、Google、Microsoft 等 IdP 签发的身份令牌。它验证令牌的签名后,为请求者签发一张有效期极短(通常 10 分钟)的 X.509 证书。
  • 证书内容:证书的 Subject 字段包含用户的 OIDC 身份(如邮箱),并嵌入 subjectAlternativeName 扩展。证书链的根是 Sigstore 公开的根证书,可通过 TUF 安全获取。
  • 无密钥签名:用户无需生成或保管长期私钥。Cosign 在签名时临时生成一个密钥对,使用私钥签名后立即丢弃,公钥则嵌入由 Fulcio 签发的证书中。
故障定位要点:Fulcio 服务的可用性直接影响签名流程。常见故障包括:OIDC IdP 令牌过期、Fulcio 证书链更新未同步、Fulcio 实例的 TLS 证书配置错误。巡检时应监控 Fulcio 的 /api/v1/signingCert 接口的 4xx/5xx 响应码及响应时间。

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

Rekor 是 Sigstore 的透明性日志服务,为所有签名元数据提供可审计、不可篡改的存储。它借鉴了 Certificate Transparency 的设计思想,但应用于软件供应链签名。

Rekor 透明性日志结构 条目 N-2 Hash: 0x7A3F... 条目 N-1 Hash: 0xB1E2... 条目 N Hash: 0xE4D5... 条目 N+1 Hash: 0xF9A8... 单条日志条目内容 • 签名载荷(Signature Payload):镜像摘要、签名值、证书链 • 元数据(Metadata):签名时间、签名者身份(OIDC 邮箱)、签名类型 • 日志索引(Log Index):条目在 Merkle 树中的位置,用于快速查询与审计 查询:cosign verify Rekor Search API 返回包含证明

Rekor 的核心功能包括:

  • 日志记录:接收签名元数据,将其组织成 Merkle 树结构,并返回一个“包含证明”(Inclusion Proof),证明该条目已被永久记录。
  • 查询接口:提供 REST API 和 gRPC 接口,支持按镜像摘要、签名证书、日志索引等方式查询签名记录。
  • 可审计性:任何人都可以运行 Rekor 客户端(如 rekor-cli)来监控日志、验证 Merkle 树的完整性,确保没有条目被篡改或删除。
容量水位巡检关键指标:Rekor 的写入吞吐量(TPS)、日志存储增长率、Merkle 树计算延迟、API 查询 P99 延迟。当 Rekor 日志存储接近容量上限或写入性能下降时,会导致签名超时和验证失败。

2.5 TUF:安全分发与信任锚点

TUF(The Update Framework)在 Sigstore 中扮演信任根分发的角色。它确保客户端能够安全地获取 Fulcio 的根证书、Rekor 的公钥以及 Cosign 的信任策略,防止中间人攻击或分发通道被篡改。

TUF 角色 在 Sigstore 中的职责 元数据文件
Root 定义所有其他角色的公钥,是信任链的锚点。Root 元数据由离线密钥签名,更新频率极低。 root.json
Targets 列出所有可下载的目标文件(如 Fulcio 证书链、Rekor 公钥)及其哈希值。 targets.json
Snapshot 记录所有元数据文件的当前版本号,防止回滚攻击。 snapshot.json
Timestamp 提供最新的 Snapshot 元数据的哈希和版本,用于快速检查更新。 timestamp.json

在 Sigstore 客户端(如 Cosign)启动时,会首先从预配置的 TUF 镜像(如 sigstore-tuf-root)下载并验证这些元数据文件。只有通过 TUF 验证的证书和公钥才会被用于后续的签名验证。

故障定位实践:TUF 元数据过期或分发仓库不可用是常见故障。巡检时应检查 TUF 客户端是否能成功拉取最新元数据,以及 timestamp.json 中的版本号是否持续递增。如果 TUF 信任锚点被篡改,所有签名验证都将失效,这是最高优先级的故障。

2.6 组件依赖关系与故障影响矩阵

下表总结了各组件之间的依赖关系以及典型故障对镜像供应链的影响,是后续巡检与定位的参考依据:

故障组件 直接影响 受影响组件 故障表现
Fulcio 无法签发新证书 Cosign(签名阶段) cosign sign 返回 503 或证书请求超时
Rekor 无法写入/查询日志 Cosign(签名+验证) 签名时写入超时;验证时无法获取包含证明
TUF 仓库 无法获取根信任 Cosign、Fulcio 客户端 证书链验证失败,所有签名被视为不可信
镜像仓库 无法推送/拉取签名 Cosign、策略引擎 签名附加失败;验证时找不到签名层
OIDC IdP 身份认证失败 Cosign(签名阶段) 获取 OIDC 失败,无法向 Fulcio 请求证书