4. Cosign 签名工具:简介、安装与签名实践

Cosign 是 Sigstore 项目下的开源容器镜像签名工具,旨在解决传统容器签名方案(如 Docker Content Trust)在密钥管理、用户体验和供应链验证上的痛点。Cosign 支持标准密钥签名、硬件安全模块(HSM)集成,以及最具代表性的无密钥签名模式(Keyless Signing),使开发者无需长期管理私钥即可完成签名与验证。

4.1 Cosign 核心能力与安装

4.1.1 功能特性一览

特性 说明 适用场景
标准密钥签名 使用本地生成的公/私钥对镜像进行签名 CI/CD 管道、内部制品仓库
无密钥签名(Keyless) 通过 OIDC 身份 + Fulcio 证书颁发机构,无需管理私钥 开源项目、多团队协作、GitHub Actions
透明日志集成 签名记录自动上传至 Rekor 公共日志,支持审计 供应链合规、事后追溯
多格式支持 支持 Docker 镜像、OCI 制品、Blob 文件 通用制品签名
策略验证 结合 Kyverno / OPA 实现部署前强制验证 Kubernetes 安全准入

4.1.2 安装 Cosign

Cosign 提供多种安装方式,推荐使用官方二进制或包管理器安装:

Linux / macOS 快速安装:
# 使用 curl 下载最新版本
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
mv cosign-linux-amd64 /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign

# 验证安装
cosign version
# macOS 使用 Homebrew
brew install cosign

# 使用 Go 安装(需 Go 1.18+)
go install github.com/sigstore/cosign/v2/cmd/cosign@latest
提示: 在 CI/CD 环境中,建议固定 Cosign 版本号,避免因工具升级导致签名/验证行为不一致。可使用 cosign version 确认当前版本。

4.2 使用 Cosign 对容器镜像进行签名

4.2.1 标准密钥签名流程

标准密钥签名需要生成密钥对,私钥由签名者保管,公钥分发给验证方。以下是完整步骤:

  1. 生成密钥对: cosign generate-key-pair 生成 cosign.key(私钥)和 cosign.pub(公钥)。
  2. 签名镜像: cosign sign --key cosign.key <镜像引用>,签名数据以 OCI 附件形式存储在镜像仓库。
  3. 验证签名: cosign verify --key cosign.pub <镜像引用>,验证签名是否匹配。
安全警告: 私钥 cosign.key 必须妥善保管,建议使用密码加密(cosign generate-key-pair 会提示设置密码)。切勿将私钥提交到代码仓库或暴露在 CI 日志中。
# 生成密钥对(交互式设置密码)
cosign generate-key-pair

# 对镜像进行签名(示例:registry.example.com/myapp:v1)
cosign sign --key cosign.key registry.example.com/myapp:v1

# 验证签名
cosign verify --key cosign.pub registry.example.com/myapp:v1

4.2.2 签名存储与验证原理

Cosign 将签名数据作为 OCI 镜像的附加层(attachment)存储,不修改原始镜像层。签名验证时,Cosign 从仓库拉取签名附件,使用公钥解密摘要并比对镜像摘要。

标准密钥签名流程 开发者 / CI cosign sign 镜像仓库 cosign verify 验证结果 cosign.key 签名数据作为 OCI 附件存储,不修改原始镜像层 验证时比对镜像摘要与签名中的摘要是否一致

4.3 无密钥签名模式(Keyless Signing)

4.3.1 无密钥签名原理

无密钥签名模式消除了私钥管理的负担。其核心思想是利用短期证书代替长期密钥:签名者通过 OIDC(OpenID Connect)身份提供商(如 GitHub、Google、Microsoft)进行身份认证,向 Sigstore 的 Fulcio 证书颁发机构申请一个短期签名证书,使用该证书对镜像签名,并将签名记录上传至 Rekor 透明日志。验证者无需预先获取公钥,只需从 Rekor 日志中检索证书链即可验证。

4.3.2 无密钥签名与验证操作

# 无密钥签名(默认模式,无需 --key 参数)
cosign sign <镜像引用>

# 系统会自动打开浏览器进行 OIDC 认证(或使用环境变量指定 )
# 签名完成后,证书和签名记录自动上传至 Rekor

# 无密钥验证
cosign verify <镜像引用>
关键区别: 无密钥签名不需要 --key 参数,Cosign 自动从 Fulcio 获取短期证书。验证时也不需要提供公钥,Cosign 从 Rekor 日志中获取证书链进行验证。

4.3.3 无密钥签名架构

无密钥签名(Keyless Signing)架构 开发者 / CI OIDC 认证 Fulcio CA 短期证书 cosign sign Rekor 日志 镜像仓库 cosign verify 验证结果 验证者无需预先获取公钥,从 Rekor 日志中检索证书链即可完成验证

4.3.4 无密钥签名 vs 标准密钥签名

对比维度 标准密钥签名 无密钥签名(Keyless)
密钥管理 需要生成、保管私钥 无需管理长期密钥
身份绑定 通过公钥指纹绑定身份 通过 OIDC 身份 + 短期证书绑定
验证方式 需要预先获取公钥 从 Rekor 日志自动获取证书链
审计能力 无内置透明日志 签名记录自动上传至 Rekor 日志
适用场景 内部仓库、离线环境 公共仓库、开源项目、CI/CD
安全性 依赖私钥保护 依赖 OIDC 身份 + 短期证书
最佳实践: 在平台工程 IDP 中,推荐优先使用无密钥签名模式,降低密钥管理复杂度。对于离线环境或需要完全控制密钥的场景,使用标准密钥签名并配合 HSM 或密钥管理服务(KMS)保护私钥。