3. 制品签名基础概念
制品签名是软件供应链安全的核心防线。在 IDP 中,从构建到部署的每个环节都可能被篡改,而数字签名提供了一种数学上可验证的完整性保证。本节将拆解签名背后的密码学原理、标准流程以及业界主流工具,为后续在 Backstage 插件中移植签名链路打下理论基础。
3.1 数字签名原理
数字签名并非对原始数据进行“加密”,而是利用非对称加密和哈希算法的组合,实现完整性、真实性和不可否认性。其核心思想是:私钥签名,公钥验签。
关键等式: 数字签名 = 私钥加密(哈希(原始数据))。验签时,用公钥解密签名得到哈希值 H1,再对原始数据重新计算哈希值 H2,若 H1 == H2,则签名有效。
3.1.1 哈希算法(Hash Algorithm)
哈希算法将任意长度的数据映射为固定长度的摘要(Digest)。它是签名流程中的“指纹生成器”。
- 单向性: 无法从摘要反推原始数据。
- 抗碰撞性: 极难找到两个不同数据产生相同哈希值。
- 常用算法: SHA-256(当前标准)、SHA-384、SHA-512。
3.1.2 非对称加密(Asymmetric Encryption)
非对称加密使用一对密钥:私钥(Private Key) 和 公钥(Public Key)。私钥必须严格保密,公钥可以公开分发。
| 特性 | 私钥 | 公钥 |
|---|---|---|
| 持有者 | 签名者(构建系统/开发者) | 验签者(部署系统/消费者) |
| 用途 | 生成签名 | 验证签名 |
| 泄露风险 | 极高(需硬件或密钥管理服务保护) | 低(可公开) |
| 常见算法 | RSA、ECDSA、Ed25519 | RSA、ECDSA、Ed25519 |
3.2 签名与验签流程
下图展示了从制品构建到部署前验签的完整流程,这是 IDP 中签名链路移植的核心逻辑。
移植适配要点: 在 Backstage 插件中,签名链路移植的核心是将验签逻辑嵌入到部署审批流程。插件需要从制品元数据中提取签名和公钥,调用底层工具(如 Cosign/Notation)的 API 完成哈希比对,并将结果以
EntityCheckResult 的形式反馈给 Backstage 的 Scorecards 或 Policies。
3.3 常见签名工具对比
在 IDP 环境中,GPG、Cosign 和 Notation 是三种主流的制品签名工具。它们各有侧重,适用于不同的制品类型和信任模型。
| 工具 | 适用场景 | 签名存储方式 | 密钥管理 | Backstage 集成难度 |
|---|---|---|---|---|
| GPG | 通用文件、Git 提交、传统软件包 | 分离签名文件(.asc) | 本地密钥环 / 智能卡 | 中等(需解析 ASCII 装甲格式) |
| Cosign | OCI 镜像(Docker/Helm Chart) | 镜像仓库标签 / 透明日志 Rekor | 密钥对 / 云 KMS / 密钥无模式(Keyless) | 低(提供 Go SDK,原生支持 OCI) |
| Notation | OCI 制品(镜像、BOM、SBOM) | OCI 引用制品(Referrers API) | 证书链 / 签名策略 | 低(CNCF 沙箱,标准化 OCI 签名) |
3.3.1 GPG(GNU Privacy Guard)
GPG 是最成熟的签名工具之一,广泛用于开源软件分发。它使用Web of Trust 模型,签名以独立文件形式存在。
# 生成 GPG 密钥对
gpg --full-generate-key
# 对制品签名(生成 .asc 文件)
gpg --detach-sign --armor my-artifact.tar.gz
# 验签
gpg --verify my-artifact.tar.gz.asc my-artifact.tar.gz
3.3.2 Cosign(Sigstore 项目)
Cosign 是云原生生态的签名标准,专为 OCI 镜像设计。它支持Keyless 签名,利用 OIDC 身份和透明日志(Rekor)实现无需管理密钥的签名。
# 使用密钥对签名 OCI 镜像
cosign sign --key cosign.key registry.example.com/my-image:v1
# Keyless 签名(使用 GitHub/GitLab OIDC)
cosign sign registry.example.com/my-image:v1
# 验签
cosign verify --key cosign.pub registry.example.com/my-image:v1
移植陷阱: Cosign 的 Keyless 模式依赖 OIDC 和 Rekor 透明日志。在离线或内网 IDP 环境中,必须回退到传统的密钥对模式,并确保 Backstage 插件能访问到公钥分发点(如
cosign.pub 或 KMS)。
3.3.3 Notation(Notary v2)
Notation 是 CNCF 沙箱项目,专注于 OCI 制品的签名和验证。它使用X.509 证书链建立信任,签名作为 OCI 引用制品存储,与镜像生命周期紧密绑定。
# 使用 Notation 签名
notation sign --key mykey registry.example.com/my-image:v1
# 配置信任策略(trust policy)
notation policy import my-policy.json
# 验签
notation verify registry.example.com/my-image:v1
3.4 签名链路在 IDP 中的关键决策点
在 Backstage 插件中移植签名链路时,需要根据 IDP 的架构做出以下决策:
- 签名时机: 在 CI 流水线中签名(构建时),还是在 Artifact 入库时由 IDP 代理签名?
- 密钥存储: 使用云 KMS(AWS KMS / Azure Key Vault / GCP Cloud KMS)还是本地 HSM?插件需要封装对应的密钥访问接口。
- 验签策略: 是“全部允许,仅记录告警”还是“验签失败则阻断部署”?Backstage 的
EntityPolicy可以承载此逻辑。 - 透明日志集成: 是否对接 Rekor 或自建审计日志?这决定了插件是否需要额外的 HTTP 客户端。
实战建议: 对于大多数 IDP 场景,推荐使用 Cosign + 密钥对模式 作为首选签名方案。它平衡了安全性与集成复杂度,且 Backstage 社区已有
@backstage/plugin-catalog-backend-module-cosign 等实验性插件可供参考。