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)来判定调用方与被调用方的版本是否匹配。
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 认证) |
| 版本差异校验适用性 | 适合长连接场景,校验粒度较粗 | 适合请求级校验,可携带自定义声明(如版本号) |
version: v2 作为自定义 claim),因为 JWT 可以在请求头中逐请求校验,无需维护长连接状态。
下图展示了两种 SVID 在服务网格中的身份验证流程:
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 获取 SVID 的完整流程:
2.4 版本差异校验中的身份基础
在服务网格治理回滚护栏中,SPIFFE 身份为版本差异校验提供了以下基础能力:
- 身份唯一性:每个工作负载实例拥有唯一的 SPIFFE ID,版本信息可编码在 Path 或 JWT claim 中。
- 身份可验证:通过 X.509 证书链或 JWT 签名,调用方可以确信对端的身份未被篡改。
- 身份可传递:JWT SVID 可以在请求链中逐跳传递,使得版本校验可以在网关、Sidecar 或应用层进行。
- 身份与网络解耦:即使 Pod IP 变化,SPIFFE ID 保持不变,回滚后新 Pod 自动继承原身份。
spiffe://prod.example.com/ns/default/sa/checkout-svc/v1。调用方(如 frontend-svc)在请求中携带 JWT SVID,校验时发现版本不匹配(v2 调用 v1),触发回滚护栏策略——拒绝请求或降级处理。