3. 签名链路架构:签名链路整体拓扑、签名服务、密钥管理、签名验证节点

在平台工程 IDP 中,制品签名不是单一操作,而是一条从密钥生成、签名计算、元数据附加到验证决策的完整链路。本章从整体拓扑出发,逐层拆解签名服务、密钥管理体系和验证节点的职责与交互模式。

3.1 签名链路整体拓扑

签名链路采用“分层解耦 + 集中管控”的架构模式,分为策略层、服务层、密钥层和验证层。下图展示了四个层次及其核心组件之间的调用关系。

签名链路整体拓扑(四层架构) 策略层 签名策略引擎 · 算法选择 · 密钥轮换策略 · 验证规则模板 策略下发 → 服务层 服务层 签名服务 (Signing Service) 接收签名请求 · 调用密钥签名 元数据服务 (Metadata Service) 附加签名元数据 · 生成签名清单 审计日志服务 记录签名事件 · 可追溯 密钥层 密钥管理服务 (KMS / HSM) 密钥生成 · 存储 · 轮换 · 签名运算 密钥仓库 (Vault / Secrets Store) 密钥版本管理 · 访问控制 · 审计 验证层 验证节点 (Verification Node) 签名校验 · 证书链验证 策略执行点 (PEP) 验证结果决策 · 准入/拒绝 回滚触发器 验证失败 → 触发回滚流程
架构要点:策略层定义“怎么签、用什么签、签完怎么验”;服务层负责编排签名流程;密钥层保证私钥不出安全边界;验证层在部署时做最终决策。四层之间通过 gRPC 或 HTTPS 接口通信,所有交互均记录审计日志。

3.2 签名服务

签名服务是签名链路的编排核心,负责接收 CI/CD 管线的签名请求,协调密钥服务和元数据服务完成签名操作。其内部流程分为五个步骤:

  1. 请求校验:验证调用方身份(mTLS / JWT)、制品哈希值、签名策略是否匹配。
  2. 密钥获取:向 KMS 请求当前有效的签名密钥(按策略选择密钥版本)。
  3. 签名计算:将制品摘要 + 元数据(时间戳、签名者身份、策略 ID)送入 KMS 进行签名运算。
  4. 元数据封装:将签名值、公钥指纹、证书链、签名算法等信息写入制品元数据文件(如 signature.json)。
  5. 结果返回:返回签名结果和元数据路径给调用方,同时写入审计日志。
接口 输入 输出 安全要求
SignArtifact 制品哈希、策略 ID、调用方凭证 签名值、元数据 JSON mTLS + 请求签名
BatchSign 制品哈希列表、策略 ID 签名清单(批量) 限流 + 审计
GetSigningStatus 制品哈希 签名状态、密钥版本、时间 只读、无敏感数据
实践建议:签名服务应设计为无状态水平扩展实例,签名运算负载全部下沉到 KMS,避免私钥在服务进程中停留。建议为每个签名请求生成唯一请求 ID,便于链路追踪和回滚审计。

3.3 密钥管理

密钥管理是签名链路的安全基石。IDP 中通常采用分层密钥体系,将根密钥、签名密钥和验证密钥分离管理。

3.3.1 密钥分层模型

  • 根密钥(Root Key):存储在 HSM 或云 KMS 中,用于签发下级密钥证书,极少使用,离线存储。
  • 签名密钥(Signing Key):用于日常制品签名,定期轮换(如每 90 天),支持密钥版本管理。
  • 验证密钥(Verification Key):公钥部分,通过证书链或公钥分发机制下发到验证节点。

3.3.2 密钥生命周期

阶段 操作 安全控制
生成 KMS 生成密钥对,私钥不出 HSM 仅限管理员 + 多人审批
激活 密钥标记为“当前版本”,开始用于签名 自动激活 / 手动激活
轮换 生成新版本,旧版本标记为“已轮换” 旧密钥保留验证能力,不再用于签名
吊销 密钥标记为“已吊销”,加入 CRL 紧急吊销需即时广播到所有验证节点
销毁 安全删除私钥(HSM 内销毁) 双人授权 + 审计日志
安全警告:签名密钥的私钥在任何情况下都不应离开 KMS 或 HSM 的安全边界。禁止将私钥导出为文件、环境变量或配置项。验证节点只持有公钥或证书链,不接触私钥。

3.4 签名验证节点

验证节点是签名链路的最终决策者,通常部署在制品部署前的准入阶段(如 Kubernetes 准入控制器、Artifactory 仓库网关)。验证节点执行以下核心逻辑:

  1. 制品摘要提取:计算当前制品的哈希值(SHA-256 / SHA-384)。
  2. 签名元数据解析:读取制品附带的 signature.json 或 .sig 文件。
  3. 公钥获取:从本地信任库或在线 OCSP 服务获取对应密钥的公钥/证书。
  4. 签名验证:使用公钥验证签名值是否与制品摘要匹配。
  5. 策略评估:检查签名算法、密钥有效期、证书链是否完整、是否在 CRL 中。
  6. 决策输出:通过则放行,失败则拒绝部署并触发回滚流程。
验证节点内部决策流程 接收制品部署请求 计算制品哈希 解析签名元数据 获取公钥 / 证书链 签名验证 + 策略评估 失败 → 拒绝 + 触发回滚 通过 → 放行部署

3.4.1 验证节点部署模式

部署位置 典型实现 延迟要求 高可用策略
Kubernetes 准入控制器 ValidatingWebhook + OPA / Kyverno < 500ms 多副本 + 本地缓存公钥
制品仓库网关 Artifactory / Harbor 插件 < 1s 负载均衡 + 异步验证队列
CI/CD 管道步骤 自定义验证步骤(cosign / jose) < 2s 重试机制 + 超时熔断
关键指标:验证节点应支持 99.99% 可用性,单次验证延迟不超过 500ms(含网络开销)。公钥缓存 TTL 建议设置为 5 分钟,配合异步刷新机制,避免每次验证都请求 KMS。

3.5 签名链路安全加固清单

  • 最小权限:签名服务仅拥有调用 KMS sign 操作的权限,无权导出密钥或执行 decrypt。
  • 传输加密:所有链路组件之间强制使用 mTLS,证书由内部 CA 签发,每 180 天轮换。
  • 审计日志:每次签名请求、密钥轮换、验证失败事件均记录到不可篡改的审计存储(如 Immutable DB)。
  • 密钥版本化:所有签名操作必须携带密钥版本 ID,验证节点根据版本 ID 查找对应公钥,避免使用“默认密钥”。
  • 回滚兼容:验证节点必须保留至少两个历史密钥版本,确保回滚到旧版本制品时仍能通过验证。
自动化回滚验证前置条件:签名链路必须提供“验证结果可编程接口”,使回滚触发器能够根据验证失败事件自动选择上一个已知良好的制品版本,并重新执行签名验证。这部分将在第 7 章详细展开。