JWT.io如何知道我的公钥?

时间:2019-07-17 23:54:26

标签: jwt rsa

入门级问题(我是JWT /加密的新手)

我的令牌:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InU0T2ZORlBId0VCb3NIanRyYXVPYlY4NExuWSIsImtpZCI6InU0T2ZORlBId0VCb3NIanRyYXVPYlY4NExuWSJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0Ny8iLCJpYXQiOjE1NjM0MDY2NjQsIm5iZiI6MTU2MzQwNjY2NCwiZXhwIjoxNTYzNDEwNTY0LCJhaW8iOiI0MkZnWUJCdGZ6U3I3YnIvcDR0cWVxZGwvMndOQmdBPSIsImFwcGlkIjoiZjFmNmQ1NWUtY2YyYy00MjJkLWIxODYtODQ4NjI0ZGI5NWU4IiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3LyIsIm9pZCI6ImRmOWRmZjhkLWJjYjUtNGIxNy04Y2VjLTRiZTFhMDFmOTIxMiIsInN1YiI6ImRmOWRmZjhkLWJjYjUtNGIxNy04Y2VjLTRiZTFhMDFmOTIxMiIsInRpZCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsInV0aSI6ImhpMDEtOFlSdUVtTExjeE05TDN6QUEiLCJ2ZXIiOiIxLjAifQ.kwfGrWiQwqhJpZfryW9D1hHDC2AC6tUT16OXkmlIeyxTMqY0gdO0U3KClYczDzMs6kpXc5sQOBaTrBQgERnfKf1nqrHoDmHzaKmY20LKByMopH9uhcPF3lkDNW - dfruNHywF6DZ4cLtgSWcZOBs_BAwQqy1i5Hja7WNf5Inyhy scXjUdntIz9rK599IzvD8MwkgYViMEXATNNh2CvEqRp-AZxVjCP_cI6h9Lx3j8__9xRIoWIwnv_rqHGcPpg6hJMfUJMtlLjJaBo0h0veCCZjPkWKNK9WKNW9W

当我将其粘贴到jwt.io时,它会自动填写一些公钥并表示已通过验证。它怎么知道公钥?

1 个答案:

答案 0 :(得分:3)

来自JWT Best Current Practices (BCP)(2019年6月6日草稿):

  

确定发行者拥有的密钥的方法是应用-   具体。例如,OpenID Connect发行者值   是引用包含以下内容的JSON元数据文档的“ https” URL   “ jwks_uri”值,它是发行者的密钥所使用的“ https” URL   被检索为JWK集[RFC7517]。使用相同的机制   ietf-oauth-发现。其他应用程序可能使用不同的   将密钥绑定到发行者的方法。

OpenID Connect(OIDC)提供程序元数据位置记录在OIDC Discovery spec

  

支持发现的OpenID提供者必须制作JSON文档   在连接字符串形成的路径上可用   /.well-known/openid-configuration发给发行人。语法和   .well-known的语义在RFC 5785中定义并适用   当它不包含路径成分时,设置为发卡行值。

如果您采用iss声明的值,请在其后附加/.well-known/openid-configuration 并将resulting URL弹出到浏览器中,您将看到OIDC提供程序元数据。此元数据文档中的一个键是jwks_uri,它指向另一个带有JSON Web密钥集的文档。后者是一组JSON Web密钥(JWK)。 JWK是加密密钥的JSON表示形式。为了标识集合中的正确JWK,请声明令牌中的声明x5t(证书/公钥的X.509指纹)和/或kid(密钥别名,通常与指纹相同)有问题的被使用。

jwt.io通过基于iss声明提取OIDC元数据,成功欺骗了整个序列的第一步。如果JWT是由不使用OpenID Connect和/或未实现所有这些相关规范的服务发行的,则jwt.io将找不到用于验证签名的密钥。