2. Sigstore 核心组件:Fulcio、Rekor 与 Cosign

Sigstore 并非单一工具,而是一套由三个核心组件构成的开放签名基础设施。理解每个组件的职责及其交互流程,是进行签名验证与资源配额调优的前提。本章将逐一拆解 Fulcio、Rekor 和 Cosign 的功能、架构与关键配置。

2.1 组件总览与职责划分

三个组件分别承担证书颁发、日志审计与签名操作的角色,形成“颁发-记录-验证”的闭环。

组件 角色 核心职责 对外接口
Fulcio 证书颁发机构 (CA) 基于 OIDC 身份签发短期代码签名证书 gRPC / HTTPS
Rekor 透明日志 (Transparency Log) 存储签名元数据,提供可审计的不可变记录 REST API
Cosign 签名与验证客户端 容器镜像签名、验证、存储签名 CLI / 库
冷启动视角: 在资源配额调优场景中,Fulcio 和 Rekor 是服务端组件,其启动速度与并发能力直接影响签名流水线的冷启动延迟;Cosign 作为客户端,其重试与超时策略决定了削峰期间的稳定性。
Sigstore 核心组件交互架构 Sigstore 核心组件交互架构 开发者 / CI OIDC Cosign 签名 / 验证 Fulcio 证书颁发 Rekor 透明日志 OIDC Provider GitHub / Google 身份令牌 请求证书 返回证书 上传签名 验证身份 流程说明 1. 开发者获取 OIDC 2. Cosign 请求 Fulcio 颁发证书 3. 签名后上传至 Rekor

2.2 Fulcio:短期证书颁发机构

Fulcio 是 Sigstore 的证书颁发机构,它利用 OIDC(OpenID Connect)协议,将用户的短期身份(如 GitHub Actions 的 ID )映射为代码签名证书。证书有效期通常为 10 分钟,大幅降低了密钥泄露风险。

2.2.1 证书颁发流程

  1. 身份断言:用户通过 OIDC Provider(如 GitHub、Google)获取身份令牌。
  2. 证书请求:Cosign 将身份令牌与公钥发送至 Fulcio。
  3. 身份验证:Fulcio 验证令牌签名,提取用户身份信息(如邮箱)。
  4. 证书签发:Fulcio 生成 X.509 证书,绑定用户身份与公钥,返回给 Cosign。
  5. 证书使用:Cosign 使用私钥对工件签名,并将证书附加到签名中。
冷启动调优点: Fulcio 的证书缓存策略。在高并发冷启动场景下,Fulcio 可缓存 OIDC Provider 的公钥与证书模板,减少每次请求的验证开销。建议配置 --enable-caching 并设置合理的 TTL。

2.2.2 关键配置参数

参数 默认值 说明 冷启动建议
--port 5555 gRPC 服务端口 保持默认
--max-issuers 100 最大支持的 OIDC Issuer 数量 根据实际 Provider 数量调整
--certificate-ttl 10m 签发证书的有效期 冷启动时可适当缩短至 5m
--enable-caching false 是否启用 OIDC 公钥缓存 建议开启

2.3 Rekor:透明日志与审计

Rekor 维护一个不可变的、可验证的透明日志,用于存储签名元数据。每次签名操作都会生成一个条目,包含工件哈希、签名、证书等信息。任何人都可以查询日志,验证签名是否在特定时间点存在。

2.3.1 日志条目结构

{
  "kind": "hashedrekord",
  "apiVersion": "0.0.1",
  "spec": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
      }
    },
    "signature": {
      "content": "MEUCIQ...",
      "publicKey": {
        "content": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..."
      }
    }
  }
}

2.3.2 存储与查询

  • 存储后端:支持内存、MySQL、PostgreSQL、Trillian(默认为内存,生产环境建议使用 Trillian + MySQL)。
  • 查询接口:通过 REST API 按 UUID、工件哈希或签名证书查询。
  • 冷启动影响:Rekor 启动时需要加载已有日志索引,数据库连接池大小直接影响启动速度。
生产环境警告: 切勿在生产环境中使用默认的内存存储。Rekor 重启后内存数据会丢失,导致日志不一致。务必配置持久化数据库,并预热连接池以减少冷启动延迟。
Rekor 日志写入与验证流程 Rekor 日志写入与验证流程 1. 提交条目 POST /api/v1/log/entries 2. 验证签名 检查证书链与哈希 3. 持久化 写入 Trillian / DB 4. 返回收据 UUID + 签名时间戳 冷启动关键路径 数据库连接池初始化 → 日志索引重建 → 首次写入延迟。建议预热连接池并预加载索引。

2.4 Cosign:签名与验证客户端

Cosign 是 Sigstore 的 CLI 工具,负责执行实际的签名与验证操作。它支持容器镜像、Blob 文件、记录等多种工件类型。

2.4.1 签名命令示例

# 使用密钥对签名
cosign sign --key cosign.key ghcr.io/myorg/myimage:v1

# 使用 Fulcio + Rekor 进行无密钥签名
cosign sign ghcr.io/myorg/myimage:v1

# 验证签名
cosign verify --key cosign.pub ghcr.io/myorg/myimage:v1

2.4.2 冷启动相关配置

环境变量 / 参数 默认值 作用 削峰建议
COSIGN_EXPERIMENTAL false 启用无密钥签名模式 冷启动时建议开启
--timeout 30s 签名/验证超时时间 削峰时适当增加至 60s
--rekor-url https://rekor.sigstore.dev Rekor 服务地址 指向自建 Rekor 实例
--fulcio-url https://fulcio.sigstore.dev Fulcio 服务地址 指向自建 Fulcio 实例
--insecure-skip-verify false 跳过证书验证(仅测试) 生产环境禁用

2.4.3 重试与退避策略

在冷启动削峰场景中,Cosign 客户端应实现指数退避重试,避免瞬时高并发压垮 Fulcio 或 Rekor。

# 示例:使用 retry 库实现重试
import (
    "github.com/avast/retry-go"
)

err := retry.Do(
    func() error {
        return cosign.Verify(ctx, imageRef, opts)
    },
    retry.Attempts(3),
    retry.Delay(500 * time.Millisecond),
    retry.MaxDelay(5 * time.Second),
)
最佳实践: 在 CI/CD 流水线中,为 Cosign 命令设置 --timeout 60s 并配合至少 3 次重试,可有效应对服务冷启动期间的瞬时延迟。

2.5 组件协同与冷启动影响

三个组件在签名流程中紧密协作,任何一个组件的冷启动延迟都会拖慢整体签名速度。下表总结了各组件在冷启动阶段的关键瓶颈。

组件 冷启动瓶颈 影响范围 调优方向
Fulcio OIDC 公钥首次获取、证书模板加载 证书签发延迟 启用缓存、预热公钥
Rekor 数据库连接池初始化、日志索引重建 签名记录写入延迟 连接池预热、预加载索引
Cosign 首次连接 TLS 握手、服务发现 签名/验证超时 增加超时、指数退避重试