3. Cosign 简介:项目背景、核心功能与在 Sigstore 生态中的角色

Cosign 是 Sigstore 生态中面向容器镜像与软件工件的签名、验证与存储工具。它解决了“谁签的名、签名是否有效、工件是否被篡改”三个核心问题,是云原生供应链安全中落地最广的签名组件之一。

3.1 项目背景:为什么需要 Cosign?

在容器化与 Kubernetes 普及之前,软件分发主要依赖包管理器(apt、npm、Maven)的 GPG 签名。容器镜像引入后,传统签名方案面临三个痛点:

  • 密钥管理复杂:GPG 密钥对生成、分发、吊销流程繁琐,不适合 CI/CD 自动化。
  • 镜像层结构不透明:镜像由多层组成,传统签名只覆盖 manifest,无法保证每层完整性。
  • 缺乏透明日志:签名行为不可审计,无法检测密钥泄露后的历史签名。

Cosign 于 2021 年由 Google、Red Hat、Chainguard 等联合推出,定位为“云原生时代的 GPG 替代品”,并成为 Sigstore 项目的核心组件之一。

关键数据:截至 2025 年,Cosign 已被超过 60% 的 CNCF 毕业项目用于镜像签名,日均签名量超过 500 万次。

3.2 核心功能矩阵

Cosign 提供从签名生成到策略验证的完整工具链,下表列出其主要功能及对应命令:

功能类别 具体能力 典型命令/参数
签名 对容器镜像、blob、文本文件进行数字签名 cosign sign
验证 验证签名是否有效、是否由可信公钥签发 cosign verify
密钥管理 生成密钥对、上传公钥到 OCI 仓库或 KMS cosign generate-key-pair
透明日志 将签名记录提交到 Rekor 透明日志 cosign sign --tlog-upload
策略评估 基于策略文件(CUE/Rego)批量验证签名 cosign verify-attestation
附件管理 附加 SBOM、SLSA 证明等元数据到镜像 cosign attach
密钥无感签名 通过 OIDC 身份自动获取短期签名证书 cosign sign --identity-
容量巡检场景提示:在镜像供应链安全容量巡检中,cosign verify 是最常用的命令。巡检脚本会遍历仓库中所有镜像,检查每个镜像是否携带有效签名,并记录未签名镜像的数量与占比。

3.3 在 Sigstore 生态中的角色

Sigstore 是一个由 Fulcio(证书颁发机构)、Rekor(透明日志) 和 Cosign(签名工具) 组成的开放签名框架。Cosign 在其中的定位是“用户与 Sigstore 基础设施之间的操作接口”。

下图展示了 Cosign 在 Sigstore 生态中的核心交互流程:

Cosign 在 Sigstore 生态中的角色 Cosign 在 Sigstore 生态中的角色 用户 / CI 流水线 Cosign 签名工具 Fulcio CA Rekor 透明日志 OCI 镜像仓库 调用签名/验证 请求签名证书 返回证书 提交签名记录 存储签名/附件 说明: Cosign 作为用户与 Sigstore 基础设施之间的操作接口,统一管理证书请求、签名生成、日志提交和工件存储。

3.4 三种签名模式对比

Cosign 支持三种签名模式,适用于不同的安全等级与自动化场景:

模式 密钥来源 适用场景 安全等级
密钥对模式 本地生成或 KMS 托管 内部私有仓库、离线环境 高(需妥善保管私钥)
密钥无感模式 通过 OIDC 从 Fulcio 获取短期证书 CI/CD 流水线、GitHub Actions 极高(证书有效期短,自动吊销)
导入模式 导入已有 GPG/PKI 密钥 从传统签名迁移过渡 中(依赖原有密钥管理)
容量巡检注意事项:在巡检大规模镜像仓库时,密钥无感模式生成的签名会附带完整的证书链,验证时需要联网查询 Fulcio 和 Rekor。如果巡检环境为离线或受限网络,建议使用密钥对模式并提前将公钥分发到所有巡检节点。

3.5 签名存储结构

Cosign 将签名以 OCI 制品的形式存储在镜像仓库中,与原始镜像位于同一仓库下。签名镜像的命名规则如下:

# 原始镜像
registry.example.com/team-a/app:v1.0.0

# Cosign 自动生成的签名镜像
registry.example.com/team-a/app:sha256-<digest>.sig

# 可选的 SBOM 附件镜像
registry.example.com/team-a/app:sha256-<digest>.sbom

# 可选的证明附件镜像
registry.example.com/team-a/app:sha256-<digest>.att

这种“镜像即签名载体”的设计使得签名与镜像天然绑定,无需额外的签名存储服务,也方便在容量巡检中通过 cosign verify 直接检查每个镜像的签名状态。