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 安装与配置已完成,可以进入下一阶段的镜像签名操作。

Cosign 安装与配置架构图 安装层:二进制部署 下载 → 赋权 → 移动至 PATH → 版本验证 密钥层:密钥对生成 cosign generate-key-pair cosign.key(私钥,加密存储) cosign.pub(公钥,可分发) 配置层:环境变量 + 配置文件 COSIGN_PASSWORD | COSIGN_PRIVATE_KEY | ~/.cosign/config.yaml 三层架构:安装层 → 密钥层 → 配置层,逐层依赖,不可跳跃