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测试连接。
下一步提示:环境准备完成后,你将进入第 4 章——使用 Cosign 对容器镜像进行签名,并学习如何将签名信息附加到镜像仓库中。