3. Sigstore 项目全景:Cosign、Rekor、Fulcio 三大组件介绍与工作流程
Sigstore 是一个用于对软件制品进行签名和验证的开放标准,旨在消除传统密钥管理带来的复杂性。其核心由三个组件构成:Cosign(签名与验证工具)、Rekor(透明日志)和 Fulcio(证书颁发机构)。三者协同工作,为容器镜像等制品提供端到端的签名、记录和验证能力。
3.1 三大核心组件概述
| 组件 | 角色 | 核心功能 | 输出/产物 |
|---|---|---|---|
| Cosign | 签名与验证客户端 | 对容器镜像、blob 等进行签名、验证和存储签名 | 签名文件(.sig)、签名镜像标签 |
| Rekor | 透明日志与时间戳 | 记录签名元数据,提供不可篡改的审计追踪 | 日志条目、签名证书(Signed Entry Timestamp, SET) |
| Fulcio | 证书颁发机构(CA) | 基于 OIDC 身份签发短期代码签名证书 | X.509 证书(有效期通常为 10 分钟) |
关键设计理念: Sigstore 通过将签名与身份(OIDC)绑定,并利用 Rekor 透明日志公开记录所有签名事件,使得任何人都可以独立验证签名的有效性和时间点,无需预先信任签名者的公钥。
3.2 Sigstore 工作流程详解
Sigstore 的典型工作流程分为签名和验证两个阶段。以下流程图展示了从开发者签名到用户验证的完整链路。
3.3 组件交互与关键步骤
- 身份认证(OIDC): 开发者使用支持 OIDC 的身份(如 Google、GitHub、Microsoft)向身份提供商进行认证,获取 ID 。
- 证书签发(Fulcio): Cosign 将 ID 发送给 Fulcio,Fulcio 验证 后签发一个短期有效的 X.509 代码签名证书。该证书将开发者的身份与公钥绑定。
- 签名(Cosign): 开发者使用 Fulcio 签发的证书及其私钥对容器镜像进行签名。Cosign 生成签名文件(.sig)和证书文件(.crt)。
- 日志记录(Rekor): Cosign 将签名元数据(包括证书、签名、镜像摘要等)提交到 Rekor 透明日志。Rekor 返回一个签名证书(SET),作为该条目已记录在日志中的凭证。
- 存储: 签名文件和证书通常与镜像一起推送到容器镜像仓库(如 Docker Hub、Harbor),或存储在 OCI 制品中。
- 验证: 验证者使用 Cosign 从镜像仓库拉取签名和证书,同时查询 Rekor 日志确认签名记录的存在性和时间戳。Cosign 验证证书链是否可追溯到 Fulcio 根证书,并检查签名是否匹配镜像内容。
安全收益: 通过 Rekor 透明日志,任何签名事件都是公开可审计的。即使签名者的私钥泄露,攻击者也无法为过去的镜像生成有效的 Rekor 条目,从而防止了历史签名被伪造。
3.4 组件对比与选型建议
| 特性 | Cosign | Rekor | Fulcio |
|---|---|---|---|
| 部署方式 | CLI 工具,无需服务端 | 需部署服务端(公共实例或自托管) | 需部署服务端(公共实例或自托管) |
| 密钥管理 | 支持密钥对、KMS、硬件密钥 | 不管理密钥,仅记录元数据 | 不管理密钥,仅签发证书 |
| 网络依赖 | 签名时需访问 Fulcio 和 Rekor | 需网络可达 | 需网络可达 |
| 离线场景 | 支持离线验证(需缓存证书链) | 不支持离线查询 | 不支持离线签发 |
| 典型用途 | CI/CD 流水线签名、本地验证 | 审计追踪、合规性证明 | 自动化证书签发 |
注意: 在生产环境中,建议使用 Sigstore 的公共实例(sigstore.dev)进行快速验证,或为内部环境部署自托管的 Rekor 和 Fulcio 实例以确保数据主权和可用性。