跳转至

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指定私钥路径用于签名或公钥路径用于验证
--bundlev3 默认输出格式,包含签名+证书+透明日志证据
--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 neededv3 已移除此环境变量删除该变量,无密钥模式已是默认行为
bundle is requiredv3 要求 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>
附加 SBOMcosign attach sbom --sbom sbom.json <image>
查看版本cosign version
离线验证cosign verify-blob file --bundle file.sigstore.json ...