2. Cosign 基础:简介、安装与配置、签名与验签基本流程

2.1 Cosign 简介

Cosign 是 Sigstore 项目下的核心工具,专为容器镜像及软件制品提供无密钥(Keyless)签名与验证能力。它解决了传统 PGP 签名中密钥管理复杂、轮换困难、难以与 CI/CD 流水线集成等痛点,成为云原生供应链安全的事实标准。

特性 传统 PGP 签名 Cosign (Sigstore)
密钥管理 需自行生成、保管、轮换私钥 支持无密钥模式,临时密钥绑定 OIDC 身份
身份绑定 依赖公钥指纹,信任传递困难 通过 Fulcio CA 签发证书,绑定邮箱/身份
透明度 无公开审计日志 签名记录写入 Rekor 透明日志,可审计
CI/CD 集成 需手动导入公钥,流程割裂 原生支持 GitHub Actions、GitLab CI 等
验证速度 本地公钥查找,较快 需查询 Rekor + Fulcio,首次验证有网络延迟
核心价值:Cosign 将签名从“基于密钥的信任”转变为“基于身份的信任”,结合透明日志,使任何人都可验证制品来源,无需预先交换公钥。

2.2 安装与配置

Cosign 提供多种安装方式,推荐使用官方二进制或包管理器安装。

2.2.1 安装方式对比

平台 命令 说明
Linux (amd64) curl -O -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 && chmod +x cosign-linux-amd64 && sudo mv cosign-linux-amd64 /usr/local/bin/cosign 直接下载最新稳定版
macOS (Homebrew) brew install cosign 自动处理依赖与路径
Docker docker pull gcr.io/projectsigstore/cosign 适合临时使用或容器化环境
Go 安装 go install github.com/sigstore/cosign/v2/cmd/cosign@latest 需预先安装 Go 1.18+

2.2.2 验证安装

cosign version

输出示例:

  ______   ______        ______   ______   ______   ______
 /      \ /      \      /      \ /      \ /      \ /      \
|  C  O  | S  I  | G  | N      | v 2  .  | 2  .   | 5      |
 \______/ \______/      \______/ \______/ \______/ \______/
Cosign Version: v2.2.5
Git Commit:     abcdef123456

2.2.3 环境配置(可选)

Cosign 默认使用 Sigstore 公共实例(Fulcio + Rekor)。若需使用私有部署或自定义 OIDC 提供者,可设置环境变量:

# 使用私有 Rekor 实例
export COSIGN_REKOR_URL=https://rekor.example.com

# 使用私有 Fulcio 实例
export COSIGN_FULCIO_URL=https://fulcio.example.com

# 指定 OIDC 提供者(如 Dex、Keycloak)
export COSIGN_OIDC_ISSUER=https://oidc.example.com
注意:在生产环境中使用私有 Sigstore 实例时,需确保所有参与方(签名者、验证者)都配置了相同的环境变量,否则验证会因无法查询透明日志而失败。

2.3 签名与验签基本流程

Cosign 支持两种签名模式:密钥对模式(适用于自动化流水线)和无密钥模式(适用于开发者手动签名)。本节以密钥对模式演示核心流程。

2.3.1 生成密钥对

cosign generate-key-pair

执行后会在当前目录生成两个文件:

  • cosign.key — 私钥,需妥善保管
  • cosign.pub — 公钥,用于验证

2.3.2 签名镜像

cosign sign --key cosign.key <镜像地址>

示例:

cosign sign --key cosign.key registry.example.com/my-app:v1.0.0

签名成功后,Cosign 会将签名信息作为 OCI 制品(manifest)推送到镜像仓库,与原始镜像共存。

2.3.3 验证签名

cosign verify --key cosign.pub <镜像地址>

示例:

cosign verify --key cosign.pub registry.example.com/my-app:v1.0.0

验证通过时输出:

Verification for registry.example.com/my-app:v1.0.0 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified using the specified public key
  - Any certificates were validated against the Fulcio roots.

2.3.4 完整流程示意图

Cosign 签名与验签基本流程(密钥对模式) ① 签名阶段 cosign.key (私钥) 镜像 Digest 生成签名 Payload 推送至镜像仓库 ② 验签阶段 cosign.pub (公钥) 签名 Manifest 验证签名 & Claims 输出验证结果 拉取签名 说明: • 签名阶段:使用私钥对镜像 Digest 签名,生成 OCI 签名制品并推送。 • 验签阶段:拉取签名制品,使用公钥验证签名完整性及镜像内容一致性。

2.4 无密钥(Keyless)签名简介

无密钥模式是 Cosign 的推荐实践,适用于开发者手动签名场景。流程如下:

  1. 身份认证:Cosign 通过 OIDC 协议(支持 GitHub、Google、Microsoft 等)获取临时身份凭证。
  2. 证书签发:Fulcio CA 根据 OIDC 令牌签发短期证书,绑定签名者邮箱。
  3. 签名:使用临时私钥对镜像签名,证书随签名一起存储。
  4. 透明日志:签名记录自动写入 Rekor,提供公开审计。
  5. 验证:验证者无需预先获取公钥,Cosign 自动从 Rekor 查询证书链并验证身份。
关键区别:密钥对模式依赖“你拥有什么密钥”,无密钥模式依赖“你是谁(OIDC 身份)”。无密钥模式消除了密钥分发和轮换的运维负担,但首次验证需要查询 Rekor 和 Fulcio,引入额外网络延迟——这正是本课程后续“验签缓存”要解决的核心问题。

2.5 本章小结

  • Cosign 是 Sigstore 生态的核心签名工具,支持密钥对和无密钥两种模式。
  • 安装方式灵活,推荐使用官方二进制或包管理器。
  • 签名与验签流程清晰:生成密钥 → 签名镜像 → 推送签名 → 拉取验证。
  • 无密钥模式简化了密钥管理,但增加了验证阶段的网络依赖,为后续缓存优化埋下伏笔。