2. Sigstore核心组件:透明日志(Rekor)、证书颁发机构(Fulcio)、客户端工具(Cosign)
Sigstore 并非单一工具,而是一套由三个核心组件构成的开放签名基础设施。理解这三个组件的职责与协作关系,是掌握镜像供应链安全削峰机制的前提。透明日志(Rekor)提供不可篡改的审计轨迹,证书颁发机构(Fulcio)实现免密钥签名,客户端工具(Cosign)则是用户与基础设施交互的入口。
2.1 组件全景与协作流程
下图展示了 Sigstore 核心组件在镜像签名与验证流程中的协作关系:开发者通过 Cosign 发起签名请求,Fulcio 签发短期证书,签名记录最终被写入 Rekor 透明日志,供后续验证与审计。
关键设计理念:Sigstore 通过将证书签发与透明日志分离,实现了“免密钥”签名。开发者无需管理长期私钥,Fulcio 签发的证书有效期通常仅为 10 分钟,大幅降低了密钥泄露风险。
2.2 Rekor:透明日志与审计锚点
Rekor 是 Sigstore 的不可篡改审计日志,负责记录所有签名元数据。它基于 Merkle Tree 数据结构,提供以下核心能力:
- 不可篡改性:每条记录通过哈希链与树根绑定,任何历史记录的修改都会导致根哈希不一致。
- 可验证性:任何人可通过 Merkle 证明 验证某条签名记录是否存在于日志中,无需信任第三方。
- 全局可见性:Rekor 实例(如公共实例
rekor.sigstore.dev)对所有参与者开放查询,形成公开审计轨迹。
| 字段 | 说明 | 示例值 |
|---|---|---|
UUID |
日志条目的唯一标识符 | 24296fb24b8ad77a |
Body |
签名元数据(Base64 编码),包含签名、证书链、制品哈希 | eyJhcGlWZXJzaW9uIjoiMC4wLjEifQ== |
IntegratedTime |
条目被写入日志的 Unix 时间戳 | 1697200000 |
LogIndex |
条目在 Merkle Tree 中的顺序索引 | 1234567 |
Verification |
Merkle 证明,用于验证条目是否被包含在树中 | SignedEntryTimestamp |
冷启动削峰关联:在镜像大规模发布场景下,Rekor 的写入吞吐量可能成为瓶颈。理解其日志结构有助于设计批量提交策略,避免瞬时写入压力导致签名失败。
2.3 Fulcio:免密钥证书颁发机构
Fulcio 实现了 Sigstore 的核心理念——基于身份的短期证书。它不验证用户是否持有长期私钥,而是通过 OIDC(OpenID Connect)身份提供商(如 GitHub、Google、Microsoft)来确认用户身份。
证书签发流程
- 身份认证:开发者通过 Cosign 发起 OIDC 登录,获取身份令牌(ID )。
- 证书请求:Cosign 生成临时密钥对,将公钥与 ID 发送至 Fulcio。
- 证书签发:Fulcio 验证 ID 的签名与有效期,签发 X.509 证书,将用户身份信息嵌入证书的 Subject Alternative Name (SAN) 字段。
- 证书返回:Cosign 使用该证书对镜像进行签名,签名完成后证书即可丢弃。
| 属性 | 值/说明 |
|---|---|
| 有效期 | 通常为 10 分钟,极短生命周期降低泄露影响 |
| 签发算法 | ECDSA P-256 |
| 身份绑定 | 通过 SAN 扩展绑定 OIDC 身份(如 email:user@example.com) |
| 证书链 | 由 Fulcio 根证书签发,验证者可通过 Fulcio 公钥链验证 |
注意:Fulcio 不存储私钥,也不管理证书吊销列表(CRL)。信任模型依赖于短期证书与透明日志的组合:即使证书被滥用,其短暂有效期和日志记录也能将风险窗口降至最低。
2.4 Cosign:客户端工具与签名操作
Cosign 是用户与 Sigstore 基础设施交互的命令行工具,支持容器镜像、Blob 文件、文档等多种制品的签名与验证。它封装了与 Fulcio、Rekor 的通信逻辑,提供简洁的接口。
核心命令与功能
cosign sign:对镜像或文件进行签名,自动触发 OIDC 认证与证书请求。cosign verify:验证签名,自动查询 Rekor 日志确认签名记录存在。cosign triangulate:根据镜像标签定位对应的签名镜像。cosign attach:将签名附加到已有镜像,而非重新推送。
签名与验证示例
# 使用 Cosign 对镜像进行签名(自动触发 OIDC 与 Fulcio)
cosign sign --key "" ghcr.io/myorg/myapp:v1
# 验证镜像签名(自动查询 Rekor 日志)
cosign verify --key "" ghcr.io/myorg/myapp:v1
# 指定 Rekor 实例(私有部署场景)
cosign sign --rekor-url https://rekor.internal.example.com ghcr.io/myorg/myapp:v1
削峰实践:在 CI/CD 流水线中,可通过
--tlog-upload=false 参数临时跳过 Rekor 写入,先完成签名与推送,后续再通过 cosign attach tlog 批量补传日志,实现写入压力的削峰填谷。
2.5 组件对比与选型参考
| 组件 | 职责 | 部署形态 | 冷启动削峰关注点 |
|---|---|---|---|
| Rekor | 透明日志,存储签名元数据 | 独立服务,支持私有部署 | 写入吞吐量、Merkle Tree 合并频率 |
| Fulcio | 基于 OIDC 的短期证书签发 | 独立服务,依赖 OIDC 提供商 | 证书签发延迟、OIDC 验证性能 |
| Cosign | 客户端签名/验证工具 | CLI 工具,无状态 | 网络请求并发数、本地密钥管理 |