2. 制品类型与签名基础

在平台工程 IDP 中,制品签名是保障软件供应链安全的第一道防线。本章将系统梳理常见制品类型、数字签名核心原理以及签名与验签的标准流程,为后续构建可观测的签名链路奠定基础。

2.1 常见制品类型

不同制品类型具有不同的打包结构、元数据格式和分发方式,签名策略也因此有所差异。下表对比了四种主流制品类型的关键特征:

制品类型 包格式 元数据文件 签名方式 典型工具
容器镜像 OCI Image Manifest config.json, manifest.json 镜像层摘要签名 + 签名对象 Cosign, Notation
Helm Chart tgz 压缩包 Chart.yaml, values.yaml prov 文件 + GPG 签名 Helm GPG, Cosign
JAR 包 ZIP 格式 META-INF/MANIFEST.MF JAR 签名 (jarsigner) jarsigner, Maven GPG
NPM 包 tgz 压缩包 package.json npm 包签名 + 完整性哈希 npm audit, Sigstore
关键提示: 容器镜像和 Helm Chart 是云原生 IDP 中最常见的制品类型,建议优先实现这两类制品的签名链路。JAR 包和 NPM 包在传统应用和前端组件中仍广泛使用,不可忽视。

2.2 数字签名原理

数字签名是制品完整性验证和来源认证的核心技术,其底层依赖两个关键机制:非对称加密和哈希摘要。

2.2.1 非对称加密

非对称加密使用一对密钥:私钥(Private Key)和公钥(Public Key)。私钥由签名者秘密保管,用于生成签名;公钥公开发布,用于验证签名。这种设计确保了即使公钥被广泛分发,也无法反向推导出私钥。

  • 私钥签名: 签名者使用私钥对制品的哈希摘要进行加密,生成签名数据。
  • 公钥验签: 验证者使用对应的公钥解密签名,并与重新计算的哈希摘要比对。

2.2.2 哈希摘要

哈希摘要(Digest)是将任意长度的制品数据通过哈希函数(如 SHA-256)映射为固定长度的唯一值。哈希函数具有以下特性:

  • 单向性: 无法从摘要反推出原始数据。
  • 抗碰撞性: 极难找到两个不同制品具有相同摘要。
  • 敏感性: 制品内容发生微小变化,摘要将完全改变。
核心公式: 签名 = 私钥加密( SHA-256( 制品内容 ) )

2.3 签名与验签流程

下图展示了完整的签名与验签流程,包含签名者(Producer)和验证者(Consumer)两个角色,以及哈希计算、签名生成、签名分发、验签比对四个核心步骤。

签名与验签流程 签名与验签流程 签名者 (Producer) 制品内容 SHA-256 哈希 私钥 (Private Key) 签名生成 签名数据 + 制品内容 (分发) 验证者 (Consumer) 接收制品 重新哈希 公钥 (Public Key) 验签比对 验证通过 / 验证失败 分发 流程说明: 1. 签名者计算制品内容的 SHA-256 哈希摘要。 2. 签名者使用私钥对哈希摘要进行加密,生成签名数据。 3. 签名者将制品内容和签名数据一起分发给验证者。 4. 验证者使用公钥解密签名,得到原始哈希摘要。 5. 验证者重新计算制品内容的哈希摘要,与解密结果比对。 6. 若一致则验证通过,否则验证失败,说明制品被篡改或来源不可信。

2.4 签名链路的关键要素

在 IDP 中构建制品签名链路时,需要关注以下关键要素:

要素 说明 推荐实践
密钥管理 私钥的安全存储与生命周期管理 使用 HSM 或云 KMS 管理私钥,定期轮换
签名策略 定义哪些制品需要签名、签名级别 生产环境制品强制签名,开发环境可选
签名存储 签名数据与制品的关联存储方式 使用 OCI 签名仓库或制品仓库的签名扩展
验签策略 部署或运行时自动验证签名 在 CI/CD 流水线和准入控制器中集成验签
审计与可观测 记录签名与验签事件,暴露 Prometheus 指标 采集签名成功率、验签延迟、密钥过期等指标
安全警告: 私钥泄露将导致整个签名体系失效。务必使用硬件安全模块(HSM)或云密钥管理服务(KMS)保护私钥,禁止将私钥硬编码在代码或配置文件中。

2.5 签名链路中的 Prometheus 指标采集点

在制品签名链路中,以下关键节点适合暴露 Prometheus 指标,用于监控签名体系的健康状态:

  • 签名操作: 签名请求总数、签名成功数、签名失败数、签名耗时。
  • 验签操作: 验签请求总数、验签通过数、验签失败数、验签耗时。
  • 密钥状态: 密钥是否过期、密钥轮换次数、密钥访问错误数。
  • 制品分发: 已签名制品数量、未签名制品数量、制品分发延迟。
实践建议: 在签名和验签的入口处添加 Prometheus 客户端埋点,使用 Histogram 类型记录耗时分布,使用 Counter 类型记录成功/失败计数,便于后续构建 Grafana 监控面板。