Cosign 基础概念:签名、验证与透明性日志

Cosign 是 Sigstore 项目中最核心的客户端工具,专为容器镜像和软件制品提供免密钥(Keyless)签名与验证能力。它解决了传统 PGP/GPG 签名中密钥管理复杂、轮换困难、缺乏审计透明性等痛点,使开发者能在 CI/CD 流水线中快速建立“谁在何时签名了哪个镜像”的可信链路。

1. 什么是 Cosign

Cosign 是一个开源的命令行工具,由 Sigstore 社区维护,支持对 OCI 制品(容器镜像、Helm Chart、SBOM 等)进行数字签名和验证。其核心特性包括:

  • 免密钥签名(Keyless Signing):利用 OIDC 身份(如 GitHub、GitLab、Google 账号)临时生成密钥对,签名后私钥立即销毁。
  • 透明性日志集成:签名记录自动上传至 Rekor 公共日志,任何人都可审计。
  • 多后端支持:签名可存储在镜像仓库标签、本地文件或 OCI 仓库中。
  • 策略引擎集成:可与 Kyverno、OPA 等策略工具配合,实现强制验证。
关键区别:传统签名工具(如 GPG)要求长期持有私钥并安全分发公钥;Cosign 通过临时密钥 + 身份绑定,将信任从“密钥”转移到“身份”,大幅降低管理成本。

2. Cosign 与 Sigstore 项目的关系

Sigstore 是一个开源的安全签名生态系统,由三个核心组件组成,Cosign 是其中面向用户的客户端工具。下表清晰展示了各组件职责:

组件 角色 核心功能
Cosign 客户端 CLI 签名、验证、存储签名到 OCI 仓库
Fulcio 证书颁发机构(CA) 基于 OIDC 身份签发短期代码签名证书
Rekor 透明性日志服务 记录签名元数据,提供不可篡改的审计线索

三者协作流程:Cosign 向 Fulcio 请求证书 → Fulcio 验证 OIDC 身份后签发短期证书 → Cosign 用该证书签名镜像 → 签名记录写入 Rekor 日志。

3. 工作原理解析

Cosign 的工作流程分为签名、验证和透明性日志三个环节,每个环节都有明确的安全设计。

3.1 签名流程

  1. 身份认证:开发者通过 OIDC 提供方(如 GitHub Actions、Google Cloud)获取身份令牌。
  2. 证书请求:Cosign 将身份令牌发送至 Fulcio,Fulcio 验证后签发短期 X.509 证书(有效期通常为 10 分钟)。
  3. 镜像摘要计算:Cosign 计算镜像的 SHA256 摘要,确保签名与内容绑定。
  4. 签名生成:使用临时私钥对镜像摘要进行签名,生成签名载荷(包含证书链、签名值、镜像引用)。
  5. 签名存储:签名以 OCI 制品形式推送到镜像仓库(如 registry.example.com/my-image:sha256-xxx.sig)。
  6. 日志记录:签名记录的 Merkle 树叶子节点提交至 Rekor 透明性日志。
签名命令示例:
# 使用 GitHub OIDC 身份签名
cosign sign --keyless \
  --identity- $ACTIONS_ID__REQUEST_ \
  registry.example.com/my-image:v1.0

3.2 验证流程

  1. 获取签名:验证者从镜像仓库拉取与镜像关联的签名制品。
  2. 证书验证:验证签名中嵌入的证书是否由可信 CA(Fulcio 根证书)签发,且证书链完整。
  3. 身份验证:检查证书中的 OIDC 身份信息(如 email、issuer)是否匹配预期策略。
  4. 摘要比对:重新计算当前镜像的 SHA256 摘要,与签名中声明的摘要比对,防止篡改。
  5. 日志审计:查询 Rekor 日志,确认该签名记录确实存在且未被删除。
验证命令示例:
# 验证镜像签名,要求身份为指定邮箱
cosign verify --keyless \
  --cert-identity user@example.com \
  --cert-oidc-issuer https://accounts.google.com \
  registry.example.com/my-image:v1.0

3.3 透明性日志(Rekor)

Rekor 是 Sigstore 的透明性日志服务,为每次签名提供不可篡改的公开记录。其核心机制包括:

  • Merkle 树结构:所有签名记录按时间顺序组织成 Merkle 树,每个叶子节点包含签名元数据的 SHA256 哈希。
  • 树头(Tree Head):Rekor 定期发布已签名的树头,包含当前 Merkle 树根哈希,任何人都可验证日志的完整性。
  • 搜索与审计:通过镜像摘要、证书指纹或身份信息查询签名记录,支持离线验证。
  • 不可抵赖性:一旦签名记录写入 Rekor,即使签名者删除本地证书,日志中的证据依然存在。
注意:Rekor 日志是公开的,签名元数据(如镜像名称、签名者身份)会暴露在公共网络中。对于私有镜像,建议使用私有 Rekor 实例或对镜像名称进行哈希处理。
Cosign 签名与验证全流程 签名阶段 开发者 / CI Fulcio CA 镜像仓库 Rekor 日志 验证阶段 验证者 / 策略 镜像仓库 Rekor 日志 策略引擎 签名阶段:临时密钥 + Fulcio 证书 + Rekor 日志记录 验证阶段:证书链验证 + 身份匹配 + 摘要比对 + 日志审计 Sigstore 组件架构与数据流 Cosign CLI Fulcio CA Rekor 日志 OCI 镜像仓库 ① Cosign 向 Fulcio 请求证书 → ② Fulcio 返回短期签名证书 → ③ Cosign 签名后推送至 OCI 仓库 ④ 签名记录同时提交至 Rekor 日志 → ⑤ 验证时从 OCI 仓库拉取签名,从 Rekor 审计记录

4. 核心优势与适用场景

特性 传统 GPG 签名 Cosign Keyless 签名
密钥管理 长期私钥,需安全存储和轮换 临时密钥,签名后立即销毁
身份绑定 依赖公钥指纹,难以关联真实身份 通过 OIDC 直接绑定邮箱/账号
审计能力 无内置日志,需自建审计系统 Rekor 透明性日志,公开可查
CI/CD 集成 需注入私钥,存在泄露风险 无密钥注入,天然适合自动化流水线
策略验证 需手动管理信任公钥列表 支持基于身份、证书颁发者的策略规则
最佳实践:在 CI/CD 流水线中,优先使用 cosign sign --keyless 配合 GitHub Actions 或 GitLab CI 的 OIDC 令牌,实现零密钥注入的自动化签名。对于离线环境或私有部署,可使用 cosign generate-key-pair 生成密钥对,但需妥善保管私钥。