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 标准密钥签名流程
标准密钥签名需要生成密钥对,私钥由签名者保管,公钥分发给验证方。以下是完整步骤:
- 生成密钥对:
cosign generate-key-pair生成cosign.key(私钥)和cosign.pub(公钥)。 - 签名镜像:
cosign sign --key cosign.key <镜像引用>,签名数据以 OCI 附件形式存储在镜像仓库。 - 验证签名:
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 从仓库拉取签名附件,使用公钥解密摘要并比对镜像摘要。
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 无密钥签名架构
4.3.4 无密钥签名 vs 标准密钥签名
| 对比维度 | 标准密钥签名 | 无密钥签名(Keyless) |
|---|---|---|
| 密钥管理 | 需要生成、保管私钥 | 无需管理长期密钥 |
| 身份绑定 | 通过公钥指纹绑定身份 | 通过 OIDC 身份 + 短期证书绑定 |
| 验证方式 | 需要预先获取公钥 | 从 Rekor 日志自动获取证书链 |
| 审计能力 | 无内置透明日志 | 签名记录自动上传至 Rekor 日志 |
| 适用场景 | 内部仓库、离线环境 | 公共仓库、开源项目、CI/CD |
| 安全性 | 依赖私钥保护 | 依赖 OIDC 身份 + 短期证书 |
最佳实践: 在平台工程 IDP 中,推荐优先使用无密钥签名模式,降低密钥管理复杂度。对于离线环境或需要完全控制密钥的场景,使用标准密钥签名并配合 HSM 或密钥管理服务(KMS)保护私钥。