4. Cosign 工具安装与配置
Cosign 是 Sigstore 项目下的核心签名工具,支持对容器镜像进行无密钥(Keyless)和密钥对(Key-Pair)两种签名模式。本章聚焦于二进制安装、密钥对生成以及环境变量与配置文件的标准化设置,为后续的镜像签名验证与准入控制提供基础环境。
4.1 Cosign 二进制安装
Cosign 提供跨平台二进制发布包,推荐从 GitHub Releases 页面获取最新稳定版本。以下为 Linux amd64 环境的安装步骤:
# 1. 下载 Cosign 二进制文件
wget https://github.com/sigstore/cosign/releases/download/v2.2.3/cosign-linux-amd64
# 2. 赋予执行权限
chmod +x cosign-linux-amd64
# 3. 移动到系统 PATH 目录
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
# 4. 验证安装
cosign version
安装完成后,执行 cosign version 应输出类似以下信息:
______ ______ ______ ______ ______ ______
/ _____| / _____| / _____| / _____| / _____| / _____|
( (____ ( (____ ( (____ ( (____ ( (____ ( (____
\____ \ \____ \ \____ \ \____ \ \____ \ \____ \
_____) ) _____) ) _____) ) _____) ) _____) ) _____) )
(______/ (______/ (______/ (______/ (______/ (______/
cosign: A tool for Container Signing, Verification and Storage
GitVersion: v2.2.3
GitCommit: abc1234
GoVersion: go1.21.5
Platform: linux/amd64
版本选择建议:生产环境建议使用 Cosign v2.x 及以上版本,v1.x 版本已停止维护。v2.x 版本默认启用 Sigstore 无密钥签名流程,同时保留对传统密钥对签名的完整支持。
4.2 密钥对生成(公钥/私钥)
Cosign 支持生成加密安全的 ECDSA-P256 密钥对,用于镜像签名与验证。密钥对生成过程不依赖外部 CA,完全本地完成。
4.2.1 生成密钥对
# 生成密钥对,系统会提示输入私钥加密密码
cosign generate-key-pair
# 输出示例:
# Enter password for private key: [输入密码,不回显]
# Enter password for private key again: [确认密码]
# Private key written to cosign.key
# Public key written to cosign.pub
执行成功后,当前目录下会生成两个文件:
| 文件 | 用途 | 安全等级 | 存储要求 |
|---|---|---|---|
cosign.key |
私钥,用于签名镜像 | 极高 | 必须加密存储,建议使用 KMS 或 HSM |
cosign.pub |
公钥,用于验证签名 | 公开 | 可分发至验证方,建议存储于 Git 仓库或 OCI 对象存储 |
4.2.2 密钥文件格式说明
私钥文件采用加密 PEM 格式,使用 scrypt 算法对私钥内容进行加密保护:
-----BEGIN ENCRYPTED COSIGN PRIVATE KEY-----
eyJrZGY...
-----END ENCRYPTED COSIGN PRIVATE KEY-----
公钥文件为标准 PEM 格式,可直接用于验证操作:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
-----END PUBLIC KEY-----
密钥安全管理要点:
- 私钥密码必须使用高强度密码(建议 16 位以上,包含大小写字母、数字和特殊字符)
- 私钥文件禁止提交到版本控制系统(Git),建议在
.gitignore中添加cosign.key - 生产环境推荐使用云 KMS(如 AWS KMS、Azure Key Vault、GCP Cloud KMS)管理私钥,避免私钥文件落盘
- 公钥可以安全地存储在 Git 仓库或 OCI 镜像仓库中,用于 CI/CD 流水线验证
4.3 环境变量与配置文件
Cosign 支持通过环境变量和配置文件两种方式管理运行时参数,便于在不同环境(开发、测试、生产)间切换配置。
4.3.1 核心环境变量
| 环境变量 | 默认值 | 说明 |
|---|---|---|
COSIGN_PASSWORD |
无 | 私钥解密密码,用于非交互式签名场景(CI/CD) |
COSIGN_PRIVATE_KEY |
./cosign.key |
私钥文件路径,可指定路径或相对路径 |
COSIGN_PUBLIC_KEY |
./cosign.pub |
公钥文件路径,用于验证操作 |
COSIGN_REPOSITORY |
镜像仓库地址 | 指定签名存储的目标 OCI 仓库,默认与镜像同仓库 |
COSIGN_EXPERIMENTAL |
0 |
启用实验性功能(如无密钥签名),设置为 1 开启 |
COSIGN_TLOG_UPLOAD |
true |
是否将签名记录上传至 Rekor 透明度日志,生产环境建议保持默认 |
4.3.2 配置文件方式
Cosign 支持通过 YAML 配置文件集中管理参数,配置文件默认路径为 $HOME/.cosign/config.yaml:
# ~/.cosign/config.yaml 示例
private-key: /etc/cosign/keys/cosign.key
public-key: /etc/cosign/keys/cosign.pub
repository: registry.example.com/signatures
experimental: false
tlog-upload: true
fulcio-url: https://fulcio.sigstore.dev
rekor-url: https://rekor.sigstore.dev
oidc-issuer: https://oauth2.example.com
配置文件优先级低于环境变量,即环境变量设置的值会覆盖配置文件中的对应项。
4.3.3 环境变量配置示例(CI/CD 场景)
# 在 CI/CD 流水线中设置环境变量
export COSIGN_PASSWORD="${COSIGN_KEY_PASSWORD}"
export COSIGN_PRIVATE_KEY="${WORKSPACE}/keys/cosign.key"
export COSIGN_PUBLIC_KEY="${WORKSPACE}/keys/cosign.pub"
export COSIGN_REPOSITORY="registry.example.com/signatures"
# 执行签名操作(无需交互输入密码)
cosign sign --key ${COSIGN_PRIVATE_KEY} registry.example.com/myapp:v1.0.0
最佳实践:
- 开发环境:使用本地密钥对文件 + 交互式密码输入
- CI/CD 环境:使用环境变量注入私钥密码,私钥文件从安全存储(如 HashiCorp Vault、AWS Secrets Manager)动态获取
- 生产环境:推荐使用 KMS 密钥管理,通过
cosign sign --kms参数直接引用云 KMS 密钥,避免私钥文件落盘 - 配置文件适用于多环境统一管理,建议将配置文件纳入配置中心(如 Consul、etcd)进行版本控制
4.4 安装与配置验证
完成上述步骤后,通过以下命令验证整体配置是否生效:
# 验证 Cosign 版本
cosign version
# 验证密钥对可用性(使用公钥验证私钥签名)
echo "hello" | cosign verify-blob --key cosign.pub --signature - <(echo "hello" | cosign sign-blob --key cosign.key -)
# 查看当前配置
cosign config
若所有命令均正常执行,说明 Cosign 安装与配置已完成,可以进入下一阶段的镜像签名操作。