3. 环境准备:安装 Cosign CLI、配置 OIDC 认证、初始化密钥对(本地与云端)

在进入镜像签名与验证的实战操作之前,必须完成本地与云端环境的初始化。本章将引导你完成 Cosign CLI 的安装、基于 OIDC 的无密钥认证配置,以及本地与云端密钥对的生成与绑定。这三步是后续所有签名、验证与回滚操作的基础设施。

前置检查:确保你拥有一个可用的容器镜像仓库(如 Docker Hub、Harbor、ACR 或 GCR),并具备推送与拉取镜像的权限。同时,建议使用 Linux/macOS 终端或 WSL2 环境执行以下命令。

3.1 安装 Cosign CLI

Cosign 是 Sigstore 项目下的核心工具,支持对容器镜像进行签名、验证和存储签名信息。推荐使用最新稳定版本。

操作系统 安装命令 / 方式 验证命令
Linux (amd64) curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64" && sudo mv cosign-linux-amd64 /usr/local/bin/cosign && sudo chmod +x /usr/local/bin/cosign cosign version
macOS (Intel/Apple Silicon) brew install cosign cosign version
Windows (PowerShell) iwr -useb https://github.com/sigstore/cosign/releases/latest/download/cosign-windows-amd64.exe -OutFile cosign.exe .\cosign version
版本锁定建议:在生产环境中,建议使用固定版本号替换 latest,例如 v2.2.3,以避免因版本升级导致的 CLI 行为变更。
# 验证安装成功示例输出
cosign version
  ______   ______        ______   ______   ______   ______
 / _____| / _____|      / _____| / _____| / _____| / _____|
| /     | | /           | |     | |     | |     | | /
| |     | | |           | |     | |     | |     | | |
| |_____| | |_____      | |_____| |_____| |_____| | |_____
 \_______| \_______|    \_______| \_______| \_______| \_______|
cosign: 2.2.3

3.2 配置 OIDC 认证(无密钥模式)

Sigstore 的 OIDC(OpenID Connect)认证允许你无需管理长期密钥即可完成签名。Cosign 会自动从环境中检测可用的 OIDC 令牌(如 GitHub Actions、Google Cloud、Microsoft Azure 等)。

以下为常见云平台的 OIDC 配置要点:

平台 OIDC 提供者 环境变量 / 配置方式 备注
GitHub Actions https://.actions.githubusercontent.com 自动注入 ACTIONS_ID__REQUEST_ 无需手动配置
Google Cloud https://accounts.google.com gcloud auth application-default login 需启用 Workload Identity Federation
Microsoft Azure https://login.microsoftonline.com az login --identity 需配置托管身份
本地开发 https://oauth2.sigstore.dev/auth 交互式浏览器登录 需手动完成 OAuth 流程
安全提醒:OIDC 模式生成的签名会绑定到你的临时身份(如 GitHub Actions 的 job ID),而非长期密钥。这降低了密钥泄露风险,但需要确保 CI/CD 环境具有正确的 OIDC 令牌权限。
# 本地开发环境测试 OIDC 认证(会弹出浏览器窗口)
cosign login

# 在 GitHub Actions 中自动使用 OIDC(无需手动登录)
# 只需确保 workflow 具有 id-: write 权限

3.3 初始化密钥对(本地与云端)

虽然 OIDC 无密钥模式是推荐方式,但在某些场景(如离线环境、私有仓库、合规要求)下仍需使用传统密钥对。Cosign 支持生成加密密钥对,并可将公钥上传至云端(如 Sigstore 的 Rekor 透明日志或 OCI 仓库)。

3.3.1 本地生成密钥对

# 生成 cosign 密钥对(默认使用 ECDSA P-256 曲线)
cosign generate-key-pair

# 执行后会在当前目录生成两个文件:
#   cosign.key    —— 私钥(必须安全保管)
#   cosign.pub    —— 公钥(可公开,用于验证签名)

# 查看公钥内容
cat cosign.pub
密钥安全最佳实践:私钥 cosign.key 应使用密码加密存储,并纳入密钥管理服务(KMS)。切勿将私钥提交到 Git 仓库或暴露在日志中。

3.3.2 将公钥上传至云端(OCI 仓库)

Cosign 支持将公钥作为 OCI 制品存储在容器镜像仓库中,便于团队共享和自动化验证。

# 将公钥上传到镜像仓库(示例使用 Docker Hub)
cosign public-key --key cosign.key > public-key.pem

# 上传公钥到 OCI 仓库(需先登录仓库)
cosign upload blob -f public-key.pem \
  --image registry.example.com/project/cosign-keys:latest

# 验证上传结果
cosign download blob \
  --image registry.example.com/project/cosign-keys:latest

3.3.3 云端密钥对与 KMS 集成

对于企业级场景,建议将密钥托管在云 KMS 中,Cosign 原生支持 AWS KMS、GCP KMS、Azure Key Vault 和 HashiCorp Vault。

KMS 类型 Cosign 引用格式 示例命令
AWS KMS awskms:///arn:aws:kms:region:account:key/key-id cosign sign --key awskms:///arn:aws:kms:us-east-1:123456789012:key/abc123-...
GCP KMS gcpkms://projects/project/locations/global/keyRings/ring/cryptoKeys/key cosign sign --key gcpkms://projects/my-project/.../cryptoKeys/my-key
Azure Key Vault azurekms://vault-name.vault.azure.net/keys/key-name cosign sign --key azurekms://myvault.vault.azure.net/keys/mykey
推荐策略:在 CI/CD 流水线中使用 OIDC 无密钥模式进行签名;在需要离线签名或合规审计时,使用 KMS 托管的密钥对。避免在本地磁盘长期保存私钥。

3.4 环境验证清单

完成上述步骤后,请逐项确认以下检查点:

  • CLI 可用:cosign version 返回版本号且无报错。
  • OIDC 令牌可获取:在 CI 环境中执行 cosign login 或检查环境变量 ACTIONS_ID__REQUEST_ 是否存在。
  • 密钥对已生成:cosign.key 和 cosign.pub 文件存在且权限正确(私钥 600,公钥 644)。
  • 公钥已上传:通过 cosign download blob 可拉取到上传的公钥内容。
  • KMS 连接正常(如适用):使用 cosign sign --key <kms-ref> --dry-run 测试连接。
环境准备整体流程 1. 安装 Cosign CLI 2. 配置 OIDC 认证 3. 初始化密钥对 Linux / macOS / Windows GitHub / GCP / Azure / 本地 本地密钥 / KMS 集成 输出产物 cosign CLI 可执行文件 | OIDC 令牌环境 | cosign.key + cosign.pub 验证清单:版本 / 令牌 / 密钥 / 上传 / KMS ✅ 环境就绪,可进行签名操作
下一步提示:环境准备完成后,你将进入第 4 章——使用 Cosign 对容器镜像进行签名,并学习如何将签名信息附加到镜像仓库中。