SVID 类型

概述

SPIRE 颁发两种类型的 SVID(SPIFFE 可验证身份文档):

  • X.509-SVID: X.509 证书

  • JWT-SVID: JSON Web Token

X.509-SVID

定义

X.509-SVID 是一个短期 X.509 证书,在 Subject Alternative Name (SAN) 扩展中包含 SPIFFE ID。

证书链

X.509-SVID 证书链包括:

  1. 叶子证书: 工作负载 SVID

  2. 中间 CA 证书: Server 的签名证书

  3. 根 CA 证书: 来自信任包

配置

server {
    # 默认 TTL(默认 1 小时)
    default_x509_svid_ttl = "1h"
    
    # Agent SVID TTL
    agent_ttl = "24h"
    
    # CA 密钥类型
    ca_key_type = "ec-p256"  # 可选: ec-p256, ec-p384, rsa-2048, rsa-4096
}

使用场景

  • mTLS 通信: 服务间安全通信

  • API 网关认证: 验证客户端身份

  • 数据库连接: 安全的数据库访问

示例

// 使用 go-spiffe 库获取 X.509-SVID
source, err := workloadapi.NewX509Source(ctx)
if err != nil {
    log.Fatal(err)
}
defer source.Close()

svid, err := source.GetX509SVID()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("SPIFFE ID: %s\n", svid.ID)

JWT-SVID

定义

JWT-SVID 是一个 JSON Web Token,在 sub 声明中包含 SPIFFE ID。

配置

server {
    # 默认 TTL(默认 5 分钟)
    default_jwt_svid_ttl = "5m"
    
    # JWT 颁发者
    jwt_issuer = "https://spire.example.org"
    
    # JWT 密钥类型
    jwt_key_type = "ec-p256"
}

JWT 声明

标准的 JWT-SVID 包含以下声明:

声明

描述

sub

SPIFFE ID

aud

目标受众

exp

过期时间

iat

颁发时间

使用场景

  • HTTP API 认证: Bearer Token 认证

  • 跨服务调用: 传播身份上下文

  • OAuth 2.0 集成: 作为客户端凭证

示例

// 使用 go-spiffe 库获取 JWT-SVID
source, err := workloadapi.NewJWTSource(ctx)
if err != nil {
    log.Fatal(err)
}
defer source.Close()

svid, err := source.FetchJWTSVID(ctx, jwtsvid.Params{
    Audience: "https://api.example.org",
})
if err != nil {
    log.Fatal(err)
}

fmt.Printf("JWT Token: %s\n", svid.Marshal())

比较

特性

X.509-SVID

JWT-SVID

格式

X.509 证书

JWT

默认 TTL

1 小时

5 分钟

使用方式

TLS 握手

HTTP Header

刷新机制

流式更新

按需获取

适用场景

长连接

短期请求

SVID 轮换

自动轮换

SPIRE Agent 自动轮换 SVID:

  • 当剩余 TTL < 50% 时触发轮换

  • 工作负载通过 Workload API 接收更新

轮换策略

        sequenceDiagram
    participant W as 工作负载
    participant A as Agent
    participant S as Server
    
    W->>A: 订阅 SVID
    A->>S: 请求 SVID
    S-->>A: 颁发 SVID
    A-->>W: 推送 SVID
    
    Note over A: TTL 到达 50%
    A->>S: 请求新 SVID
    S-->>A: 颁发新 SVID
    A-->>W: 推送新 SVID
    

最佳实践

建议

  1. 使用短期 TTL: 减少证书泄露的影响

  2. 选择合适的类型: mTLS 用 X.509,API 认证用 JWT

  3. 实现优雅的轮换: 确保应用程序能处理 SVID 更新

  4. 监控 SVID 状态: 设置过期告警