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 证书链包括:
叶子证书: 工作负载 SVID
中间 CA 证书: Server 的签名证书
根 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 包含以下声明:
声明 |
描述 |
|---|---|
|
SPIFFE ID |
|
目标受众 |
|
过期时间 |
|
颁发时间 |
使用场景
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
最佳实践
建议
使用短期 TTL: 减少证书泄露的影响
选择合适的类型: mTLS 用 X.509,API 认证用 JWT
实现优雅的轮换: 确保应用程序能处理 SVID 更新
监控 SVID 状态: 设置过期告警