如何验证自签发JWT?自签发OP响应密钥验证逻辑解析
Self-Issued OpenID Provider (SIOP) 令牌机制解析:公钥嵌入与防伪造逻辑
针对你提到的Self-Issued OP令牌疑问,核心要理解这种模式是去中心化身份验证的特殊设计,和传统依赖第三方IDP的OpenID流程完全不同,下面拆解关键逻辑:
一、如何防止攻击者用伪造密钥对生成令牌?
Self-Issued OP的核心信任锚点是身份标识符(iss)与嵌入公钥(sub_jwk)的强绑定,验证方需要完成两步关键验证:
- 签名验证:用令牌内的
sub_jwk公钥验证JWT签名,确保令牌内容未被篡改(这一步你已经理解); - 身份-公钥绑定验证:验证
iss声明必须与sub_jwk的公钥严格匹配。具体规则是:iss的值通常是sub_jwk公钥的Base64URL编码SHA-256哈希(或者是用户的去中心化身份标识DID,而DID文档中必须包含该公钥);- 验证方会重新计算
sub_jwk公钥的哈希,对比是否和iss一致;如果是DID,则解析DID文档确认其中包含该公钥。
攻击者用伪造密钥对生成令牌时,要么无法生成与伪造公钥匹配的iss(因为哈希是唯一的),要么这个iss不是验证方信任的用户身份标识符,验证直接失败。
二、令牌中包含公钥的意义何在?
传统OpenID流程中,验证方从IDP的JWKS端点获取公钥,但Self-Issued OP没有中心化的IDP服务器,也就没有固定的JWKS分发渠道。把公钥嵌入令牌的核心价值是:
- 无需依赖外部服务:验证方不需要预先配置或动态请求第三方密钥服务,直接从令牌中获取验证所需的公钥,降低了架构复杂度;
- 适配去中心化场景:Self-Issued OP的核心是用户作为自己的身份提供者,密钥由用户自行管理,嵌入公钥让验证方可以直接完成身份验证,无需用户维护额外的密钥分发端点;
- 简化信任链:公钥与身份标识符的绑定逻辑直接包含在令牌中,验证方不需要依赖第三方的密钥信任关系,只需要验证绑定一致性即可。
三、完整机制运作流程
结合你给出的示例JWT,完整验证流程如下:
- 用户端生成令牌:用户生成RSA密钥对,用私钥签名JWT;将公钥放入
sub_jwk字段,iss设置为该公钥的SHA-256哈希(示例中iss为https://self-issued.me是简化表示,实际场景会是公钥哈希或DID); - 令牌传递:用户将JWT发送给依赖方(RP);
- RP验证步骤:
- 提取
sub_jwk中的公钥,验证JWT签名,确保内容未被篡改; - 计算
sub_jwk公钥的SHA-256哈希,对比是否与iss声明一致; - 验证标准JWT声明:检查
exp(过期时间)、iat(签发时间)、aud(受众)、nonce(随机值)的有效性;
- 提取
- 信任确认:所有验证通过后,RP确认持有对应私钥的用户就是
iss声明的身份所有者,完成身份验证。
内容的提问来源于stack exchange,提问作者Jakob Busk Sørensen
相关产品推荐
相关产品推荐

