Cosign — 容器镜像签名与验证工具
安装与配置
# === 方法1: Homebrew 安装(macOS/Linux)===
brew install cosign # 通过 Homebrew 安装 cosign
# === 方法2: 下载二进制文件(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 # 添加执行权限
# === 方法3: Go 安装(需要 Go 1.20+)===
go install github.com/sigstore/cosign/v3/cmd/cosign@latest # 用 go install 安装最新版
# === 验证安装 ===
cosign version # 查看当前版本(v3.x 稳定版)
核心用法
# --- 无密钥签名(Keyless,推荐用于 CI/CD)---
cosign sign <镜像URI> # 无密钥签名,会弹出浏览器进行 OIDC 认证
# 签名结果默认存储为 bundle 格式(v3 新默认)
# --- 密钥对签名 ---
cosign generate-key-pair # 生成一对公私钥(cosign.key + cosign.pub)
cosign sign --key cosign.key <镜像URI> # 用私钥对镜像签名
# --- 验证签名 ---
cosign verify --key cosign.pub <镜像URI> # 用公钥验证镜像签名
cosign verify --certificate-identity=user@example.com \
--certificate-oidc-issuer=https://accounts.google.com \
<镜像URI> # 无密钥模式验证(指定身份和 OIDC 发行者)
# --- 附加 SBOM(软件物料清单)---
cosign attach sbom --sbom sbom.json <镜像URI> # 将 SBOM 附加到镜像
# --- 离线验证(用 bundle 文件)---
cosign verify-blob myfile --bundle myfile.sigstore.json \
--certificate-identity=user@example.com \
--certificate-oidc-issuer=https://accounts.google.com # 用 bundle 离线验证文件
参数详解
| 参数 | 说明 |
|---|
--key | 指定私钥路径用于签名或公钥路径用于验证 |
--bundle | v3 默认输出格式,包含签名+证书+透明日志证据 |
--certificate-identity | 无密钥验证时指定签名者身份(邮箱) |
--certificate-oidc-issuer | 无密钥验证时指定 OIDC 提供商 URL |
--trusted-root | 指定信任根文件(包含 CA 证书链) |
--signing-config | 指定签名配置文件(服务 URL 等) |
-r / --recursive | 递归签名多架构镜像的所有平台 |
--tlog-upload=false | 不上传到透明日志(私有场景) |
实战案例
# === 完整流程:构建、签名、验证容器镜像 ===
# 第1步:构建并推送镜像
docker build -t myregistry.io/myapp:v1.0 . # 构建镜像
docker push myregistry.io/myapp:v1.0 # 推送到仓库
# 第2步:获取镜像摘要(签名用摘要更安全)
DIGEST=$(crane digest myregistry.io/myapp:v1.0) # 获取镜像 sha256 摘要
IMAGE="myregistry.io/myapp@${DIGEST}" # 拼接完整的摘要引用
# 第3步:生成密钥对
cosign generate-key-pair # 生成 cosign.key(私钥)和 cosign.pub(公钥)
# 第4步:签名镜像
cosign sign --key cosign.key ${IMAGE} # 用私钥签名,签名存储在镜像仓库中
# 第5步:验证签名
cosign verify --key cosign.pub ${IMAGE} # 验证成功会输出签名详情的 JSON
# 第6步:在 Kubernetes 中集成验证(配合 Kyverno 或 OPA)
# Kyverno 策略示例:只允许经过签名的镜像部署
常见报错与解决
| 报错 | 原因 | 解决方案 |
|---|
no matching signatures | 镜像未签名或密钥不匹配 | 检查公钥是否对应、镜像 URI 是否正确 |
COSIGN_EXPERIMENTAL is no longer needed | v3 已移除此环境变量 | 删除该变量,无密钥模式已是默认行为 |
bundle is required | v3 要求 bundle 输出 | 添加 --bundle 参数或升级到 v3 |
error getting rekor public keys | 网络无法访问 Rekor 透明日志 | 检查网络或使用 --tlog-upload=false |
could not find a valid credential | 未登录容器仓库 | 先执行 docker login 或配置凭证 |
速查表
| 操作 | 命令 |
|---|
| 生成密钥对 | cosign generate-key-pair |
| 签名镜像(密钥) | cosign sign --key cosign.key <image> |
| 签名镜像(无密钥) | cosign sign <image> |
| 验证签名(密钥) | cosign verify --key cosign.pub <image> |
| 验证签名(无密钥) | cosign verify --certificate-identity=... --certificate-oidc-issuer=... <image> |
| 附加 SBOM | cosign attach sbom --sbom sbom.json <image> |
| 查看版本 | cosign version |
| 离线验证 | cosign verify-blob file --bundle file.sigstore.json ... |