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 完整流程示意图
2.4 无密钥(Keyless)签名简介
无密钥模式是 Cosign 的推荐实践,适用于开发者手动签名场景。流程如下:
- 身份认证:Cosign 通过 OIDC 协议(支持 GitHub、Google、Microsoft 等)获取临时身份凭证。
- 证书签发:Fulcio CA 根据 OIDC 令牌签发短期证书,绑定签名者邮箱。
- 签名:使用临时私钥对镜像签名,证书随签名一起存储。
- 透明日志:签名记录自动写入 Rekor,提供公开审计。
- 验证:验证者无需预先获取公钥,Cosign 自动从 Rekor 查询证书链并验证身份。
关键区别:密钥对模式依赖“你拥有什么密钥”,无密钥模式依赖“你是谁(OIDC 身份)”。无密钥模式消除了密钥分发和轮换的运维负担,但首次验证需要查询 Rekor 和 Fulcio,引入额外网络延迟——这正是本课程后续“验签缓存”要解决的核心问题。
2.5 本章小结
- Cosign 是 Sigstore 生态的核心签名工具,支持密钥对和无密钥两种模式。
- 安装方式灵活,推荐使用官方二进制或包管理器。
- 签名与验签流程清晰:生成密钥 → 签名镜像 → 推送签名 → 拉取验证。
- 无密钥模式简化了密钥管理,但增加了验证阶段的网络依赖,为后续缓存优化埋下伏笔。