2. SPIFFE 基础:SPIFFE ID 格式、X.509 SVID 与 JWT SVID、Workload API

SPIFFE(Secure Production Identity Framework for Everyone)是云原生环境下为每个工作负载(Workload)分配唯一身份的标准框架。在服务网格治理回滚护栏中,SPIFFE 提供的身份是版本差异校验的信任锚点——只有明确知道“谁在调用谁”,才能判断版本是否兼容。本节从三个核心概念入手:SPIFFE ID 的命名规则、两种 SVID 的差异、以及 Workload API 如何分发身份。

2.1 SPIFFE ID 格式

SPIFFE ID 是一个 URI,采用 spiffe://trust-domain/path 的格式,用于唯一标识一个工作负载。其结构如下:

组成部分 示例 说明
Scheme spiffe:// 固定前缀,标识该 URI 属于 SPIFFE 命名空间
Trust Domain prod.example.com 信任域,通常对应组织或环境(如生产、预发),由 CA 根证书绑定
Path /ns/default/sa/checkout-svc 路径段,可包含命名空间、服务账户、服务名等层级信息

在服务网格中,典型的 SPIFFE ID 如:spiffe://prod.example.com/ns/default/sa/checkout-svc/v2。版本差异校验正是通过解析 Path 中的版本标识(如 v2)来判定调用方与被调用方的版本是否匹配。

关键原则:SPIFFE ID 是“身份”而非“位置”。它不绑定 IP 或 DNS,只描述工作负载的归属和角色。这使得在回滚场景中,即使 Pod 被重新调度,身份依然不变。

2.2 X.509 SVID 与 JWT SVID

SVID(SPIFFE Verifiable Identity Document)是 SPIFFE ID 的载体,分为两种类型:X.509 SVID 和 JWT SVID。两者在服务网格中的使用场景不同,下表对比了核心差异:

对比维度 X.509 SVID JWT SVID
格式 X.509 证书 + 私钥 JSON Web (JWT)
身份嵌入方式 证书 SAN 中的 SPIFFE ID(URI 类型) JWT 的 sub 字段
生命周期 通常较长(小时级到天级),支持 mTLS 握手 较短(分钟级到小时级),适合短连接或 HTTP 头传递
验证方式 证书链校验 + 公钥加密 JWT 签名验证(RS256/ES256)
服务网格典型用途 Envoy 之间的 mTLS 连接 HTTP 请求头中的身份传递(如 Istio 的 JWT 认证)
版本差异校验适用性 适合长连接场景,校验粒度较粗 适合请求级校验,可携带自定义声明(如版本号)
实践建议:在回滚护栏中,推荐使用 JWT SVID 携带版本信息(如 version: v2 作为自定义 claim),因为 JWT 可以在请求头中逐请求校验,无需维护长连接状态。

下图展示了两种 SVID 在服务网格中的身份验证流程:

X.509 SVID 与 JWT SVID 验证流程对比 X.509 SVID 流程 工作负载 A 获取 X.509 SVID mTLS 握手:交换证书 校验证书链 + SAN 中的 SPIFFE ID JWT SVID 流程 工作负载 A 获取 JWT SVID HTTP 请求头携带 JWT 校验 JWT 签名 + sub 字段 + 自定义 claim

2.3 Workload API

Workload API 是 SPIRE Agent 暴露给本地工作负载的 gRPC 接口,用于获取 SVID 和信任 bundle。工作负载通过 Unix Domain Socket(UDS)调用该 API,无需关心底层证书签发细节。其核心接口包括:

  • FetchX509SVID:获取 X.509 SVID 证书和私钥,用于 mTLS 连接。
  • FetchJTVSVID:获取 JWT SVID,用于请求级身份传递。
  • FetchX509Bundles:获取信任域内的 CA 根证书集合,用于验证对端 SVID。
  • FetchJWTBundles:获取 JWT 签名公钥集合,用于验证 JWT SVID 签名。
安全注意:Workload API 通过 UDS 暴露,仅允许同一节点上的进程访问。SPIRE Agent 使用节点上的进程元数据(如 cgroup、UID)来验证调用方身份,防止未授权工作负载获取 SVID。

下图展示了工作负载通过 Workload API 获取 SVID 的完整流程:

Workload API 身份获取流程 工作负载 (Pod / 进程) SPIRE Agent (节点代理) SPIRE Server (CA 签发) 1. FetchX509SVID 2. 签发请求 3. 返回 SVID + 私钥 信任 Bundle 获取(可选) FetchX509Bundles / FetchJWTBundles 用于验证对端 SVID 的 CA 根证书或 JWT 签名公钥

2.4 版本差异校验中的身份基础

在服务网格治理回滚护栏中,SPIFFE 身份为版本差异校验提供了以下基础能力:

  1. 身份唯一性:每个工作负载实例拥有唯一的 SPIFFE ID,版本信息可编码在 Path 或 JWT claim 中。
  2. 身份可验证:通过 X.509 证书链或 JWT 签名,调用方可以确信对端的身份未被篡改。
  3. 身份可传递:JWT SVID 可以在请求链中逐跳传递,使得版本校验可以在网关、Sidecar 或应用层进行。
  4. 身份与网络解耦:即使 Pod IP 变化,SPIFFE ID 保持不变,回滚后新 Pod 自动继承原身份。
回滚场景示例:当 checkout-svc 从 v2 回滚到 v1 时,SPIRE 会为新的 v1 Pod 签发 SPIFFE ID spiffe://prod.example.com/ns/default/sa/checkout-svc/v1。调用方(如 frontend-svc)在请求中携带 JWT SVID,校验时发现版本不匹配(v2 调用 v1),触发回滚护栏策略——拒绝请求或降级处理。