2、Sigstore核心组件解析:Cosign、Fulcio、Rekor、TUF的架构与功能
Sigstore 并非单一工具,而是一套由多个开源组件构成的云原生签名基础设施。其核心设计目标是消除传统密钥管理痛点,为软件供应链提供“开箱即用”的代码签名与验证能力。本章深入解析四大核心组件:Cosign(签名与验证客户端)、Fulcio(短期证书颁发机构)、Rekor(透明性日志)以及 TUF(更新框架)的架构设计与功能职责。
2.1 组件全景与协作流程
在镜像供应链场景中,一次典型的 Sigstore 签名流程涉及所有核心组件。下图展示了从开发者签名到运维验证的完整链路:
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 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 签发的证书中。
/api/v1/signingCert 接口的 4xx/5xx 响应码及响应时间。
2.4 Rekor:不可篡改的透明性日志
Rekor 是 Sigstore 的透明性日志服务,为所有签名元数据提供可审计、不可篡改的存储。它借鉴了 Certificate Transparency 的设计思想,但应用于软件供应链签名。
Rekor 的核心功能包括:
- 日志记录:接收签名元数据,将其组织成 Merkle 树结构,并返回一个“包含证明”(Inclusion Proof),证明该条目已被永久记录。
- 查询接口:提供 REST API 和 gRPC 接口,支持按镜像摘要、签名证书、日志索引等方式查询签名记录。
- 可审计性:任何人都可以运行 Rekor 客户端(如
rekor-cli)来监控日志、验证 Merkle 树的完整性,确保没有条目被篡改或删除。
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 验证的证书和公钥才会被用于后续的签名验证。
timestamp.json 中的版本号是否持续递增。如果 TUF 信任锚点被篡改,所有签名验证都将失效,这是最高优先级的故障。
2.6 组件依赖关系与故障影响矩阵
下表总结了各组件之间的依赖关系以及典型故障对镜像供应链的影响,是后续巡检与定位的参考依据:
| 故障组件 | 直接影响 | 受影响组件 | 故障表现 |
|---|---|---|---|
| Fulcio | 无法签发新证书 | Cosign(签名阶段) | cosign sign 返回 503 或证书请求超时 |
| Rekor | 无法写入/查询日志 | Cosign(签名+验证) | 签名时写入超时;验证时无法获取包含证明 |
| TUF 仓库 | 无法获取根信任 | Cosign、Fulcio 客户端 | 证书链验证失败,所有签名被视为不可信 |
| 镜像仓库 | 无法推送/拉取签名 | Cosign、策略引擎 | 签名附加失败;验证时找不到签名层 |
| OIDC IdP | 身份认证失败 | Cosign(签名阶段) | 获取 OIDC 失败,无法向 Fulcio 请求证书 |