自建OIDC服务器对接GCP Workload Identity Federation技术问询
核心术语明确
你要搜索的核心关键词是:OIDC Discovery Document(OIDC发现文档)、JWKS (JSON Web Key Set),GCP侧对应的是Workload Identity Provider 自定义OIDC身份源。
GCP与自托管OIDC Issuer的交互流程
当GCP验证你的自定义JWT时,会自动按以下步骤和你的OIDC服务器交互:
- 请求OIDC发现文档:发起
GET {你的Issuer URL}/.well-known/openid-configuration请求 - 从发现文档中提取JWKS端点,再发起
GET {jwks_uri}请求获取公钥,用于验证JWT签名
各请求的格式与响应要求
1. OIDC发现文档请求
- 请求格式:无参数的GET请求,GCP直接访问指定路径
- 响应要求:返回JSON格式,必须包含以下核心字段:
其他可选字段可参考OIDC标准,但GCP只需要上述核心字段即可。{ "issuer": "https://your-issuer-domain.com", // 与GCP WIP配置的Issuer URL完全一致,不能有末尾斜杠 "jwks_uri": "https://your-issuer-domain.com/.well-known/jwks.json", // 你的JWKS端点地址 "id_token_signing_alg_values_supported": ["RS256"] // 你用于签名JWT的算法,推荐非对称算法如RS256、ES256 }
2. JWKS端点请求
- 请求格式:无参数的GET请求
- 响应要求:返回JWKS格式的JSON,包含你用于签名JWT的公钥。示例:
注意:公钥必须是你签名JWT时用的私钥对应的公钥,GCP会用它校验JWT的合法性。{ "keys": [ { "kty": "RSA", // 密钥类型,对应你用的算法,RSA对应RS256 "use": "sig", // 用途为签名 "alg": "RS256", // 签名算法 "kid": "your-unique-key-id", // 密钥ID,必须与你生成JWT时头部的kid字段完全一致 "n": "abcdefghijklmnopqrstuvwxyz...", // RSA公钥的模值,base64url编码 "e": "AQAB" // RSA公钥的指数,通常为AQAB(对应十进制65537) } ] }
额外关键注意事项
- 你的OIDC服务器端点(发现文档、JWKS)必须能被GCP的公共服务访问到;如果是内部部署,需通过VPC peering等方式打通网络。
- 你生成的JWT必须满足GCP的Claim要求:
iss:与OIDC发现文档中的issuer字段完全一致sub:需匹配你在GCP Workload Identity Provider中配置的Subject规则(精确匹配、前缀匹配等)aud:必须为https://iam.googleapis.com/projects/{你的项目编号}/locations/global/workloadIdentityPools/{你的池ID}/providers/{你的提供者ID}exp:过期时间不能超过1小时(GCP硬性限制)iat:签发时间需在当前时间的±10分钟内(防止时钟偏移导致验证失败)
内容的提问来源于stack exchange,提问作者chrispytoes
相关产品推荐
相关产品推荐

