Cosign工具镜像供应链信任边界驱动开发与调优 - 第2节

2.1 Cosign 是什么

Cosign 是 Sigstore 项目下的一个开源工具,专为容器镜像和软件制品提供签名、验证和存储能力。它解决了“谁签的、签的什么、签完有没有被改”这三个核心信任问题,是云原生供应链安全中实现“非侵入式信任”的关键组件。

核心定位:Cosign 不要求你修改 Dockerfile 或镜像构建流程,它通过 OCI 制品扩展机制将签名数据附着在镜像仓库中,实现签名与镜像的“同仓共存”。

2.2 核心功能

功能 说明 典型命令
签名 使用私钥或 OIDC 身份对镜像摘要进行数字签名,生成签名载荷 cosign sign
验证 使用公钥或 OIDC 身份验证签名是否匹配镜像摘要,并检查签名者身份 cosign verify
存储 将签名、证书、时间戳等元数据以 OCI 制品形式存入镜像仓库 自动关联,无需额外命令
发现 通过仓库标签或 OCI 引用自动查找与镜像关联的签名 cosign triangulate

2.3 与 Docker / OCI 镜像的关系

Cosign 不修改镜像本身,而是利用 OCI 镜像规范的扩展能力,将签名数据作为独立的 OCI 制品(Artifact)存储在同一个仓库中。这种设计保证了镜像的原始性,同时让签名与镜像保持强关联。

Cosign 与 OCI 镜像的关系 OCI 镜像 Manifest + 层数据 sha256:abc123... 签名 OCI 制品 签名载荷 + 证书 sha256:def456... 同一镜像仓库(registry.example.com) cosign sign 关联 签名不嵌入镜像层,而是作为独立 OCI 制品与镜像同仓存储

2.4 安装与 CLI 初探

2.4.1 安装方式

平台 命令
Linux (amd64) curl -sL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign && chmod +x /usr/local/bin/cosign
macOS (Homebrew) brew install cosign
Windows (Scoop) scoop install cosign
容器运行 docker run --rm -v $HOME/.docker:/root/.docker gcr.io/projectsigstore/cosign

2.4.2 验证安装

cosign version

  ______   ______        ______   ______   ______   ______
 / _____| / _____/      / _____/ / _____/ / ____/ / _____/
( (____  ( (____       ( (____  ( (____  ( (___  ( (____
 \____ \  \____ \       \____ \  \____ \  \___ \  \____ \
 _____) ) _____) )      _____) ) _____) ) ____) ) _____) )
(______/ (______/      (______/ (______/ (______/ (______/
Cosign Version: v2.2.0
Git Commit:     abcdefg

2.4.3 快速体验:签名与验证

以下命令演示对一个测试镜像进行签名和验证的完整流程:

# 1. 生成密钥对(仅演示用,生产推荐 OIDC)
cosign generate-key-pair

# 2. 对镜像签名(需要镜像已推送到仓库)
cosign sign --key cosign.key registry.example.com/my-image:v1

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

# 输出示例:
# Verification for registry.example.com/my-image:v1 --
# The following checks were performed on each of these signatures:
#   - The cosign claims were validated
#   - The signatures were verified using the specified public key
#   - Any certificates were verified against the Fulcio roots.
提示:Cosign v2.x 默认使用 OCI 引用(Referrers API)存储签名,不再依赖镜像标签。这避免了标签污染,并提升了签名发现的可靠性。

2.5 签名存储机制

Cosign 支持两种签名存储模式,理解它们的差异对生产部署至关重要:

模式 存储方式 优点 缺点
OCI 引用(推荐) 通过 Referrers API 将签名作为独立 Manifest 存储 标准、可发现、无标签冲突 需要仓库支持 Referrers API
标签模式(兼容) 将签名存储在 sha256-xxx.sig 标签下 兼容旧仓库 标签数量膨胀、可发现性差
签名存储模式对比 OCI 引用模式(推荐) 镜像 Manifest → Referrers API → 签名 Manifest 仓库自动关联,无需额外标签 标签模式(兼容) 镜像标签 → sha256-xxx.sig 标签 每个签名占用一个独立标签 迁移建议:新项目优先使用 OCI 引用模式 旧项目可通过 cosign migrate 从标签模式迁移到 OCI 引用模式
注意:如果镜像仓库不支持 OCI 引用(如某些私有仓库或旧版本 Harbor),Cosign 会自动降级到标签模式。建议在部署前使用 cosign triangulate 验证仓库的兼容性。