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 签名流程
- 身份认证:开发者通过 OIDC 提供方(如 GitHub Actions、Google Cloud)获取身份令牌。
- 证书请求:Cosign 将身份令牌发送至 Fulcio,Fulcio 验证后签发短期 X.509 证书(有效期通常为 10 分钟)。
- 镜像摘要计算:Cosign 计算镜像的 SHA256 摘要,确保签名与内容绑定。
- 签名生成:使用临时私钥对镜像摘要进行签名,生成签名载荷(包含证书链、签名值、镜像引用)。
- 签名存储:签名以 OCI 制品形式推送到镜像仓库(如
registry.example.com/my-image:sha256-xxx.sig)。 - 日志记录:签名记录的 Merkle 树叶子节点提交至 Rekor 透明性日志。
签名命令示例:
# 使用 GitHub OIDC 身份签名
cosign sign --keyless \
--identity- $ACTIONS_ID__REQUEST_ \
registry.example.com/my-image:v1.0
3.2 验证流程
- 获取签名:验证者从镜像仓库拉取与镜像关联的签名制品。
- 证书验证:验证签名中嵌入的证书是否由可信 CA(Fulcio 根证书)签发,且证书链完整。
- 身份验证:检查证书中的 OIDC 身份信息(如 email、issuer)是否匹配预期策略。
- 摘要比对:重新计算当前镜像的 SHA256 摘要,与签名中声明的摘要比对,防止篡改。
- 日志审计:查询 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 实例或对镜像名称进行哈希处理。
4. 核心优势与适用场景
| 特性 | 传统 GPG 签名 | Cosign Keyless 签名 |
|---|---|---|
| 密钥管理 | 长期私钥,需安全存储和轮换 | 临时密钥,签名后立即销毁 |
| 身份绑定 | 依赖公钥指纹,难以关联真实身份 | 通过 OIDC 直接绑定邮箱/账号 |
| 审计能力 | 无内置日志,需自建审计系统 | Rekor 透明性日志,公开可查 |
| CI/CD 集成 | 需注入私钥,存在泄露风险 | 无密钥注入,天然适合自动化流水线 |
| 策略验证 | 需手动管理信任公钥列表 | 支持基于身份、证书颁发者的策略规则 |
最佳实践:在 CI/CD 流水线中,优先使用
cosign sign --keyless 配合 GitHub Actions 或 GitLab CI 的 OIDC 令牌,实现零密钥注入的自动化签名。对于离线环境或私有部署,可使用 cosign generate-key-pair 生成密钥对,但需妥善保管私钥。