标签: jwk

.Net Core JwtBearer 中间件使用 Amazon Cognito

所以我在 .net Core angular 应用程序中使用 Cognito(使用 amazon-javascript-sdk),我试图验证我在 .net core 后端从亚马逊获得的 access_token,以便我可以保护我的 Web Api . 使用 Amazon cognito JWKS 我能够验证 access_token 并因此允许/拒绝访问我的 api。问题是我现在在我的 startup.cs 中硬编码了 JWK 密钥。我从 JWKS 了解到的是,这些密钥可以轮换(没有发现亚马逊是否这样做),所以我想以某种方式告诉我的中间件从端点获取密钥。我阅读了一些有关发现文档和其他内容的内容,但找不到有关如何配置中间件以自动执行此操作的任何内容。

对于 OpenId,您可以使用 MetadataAddress 指向https://cognito-idp .{awsregion}.amazonaws.com/{userPool}/.well-known/openid-configuration,这将获得所有必要的配置。如果您使用 JwtBearer 中间件,我觉得 IssuerSigningKey(JWK) 应该存在类似的东西。我希望指向 JWK url,而不是设置一个硬编码的密钥,中间件将在其中找到密钥并执行它的魔法。JWKS 还包含多个密钥,因此我希望中间件自行确定要使用哪个密钥。

相关代码:

services.AddAuthentication(options =>
{
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwt =>
{
    jwt.TokenValidationParameters = new TokenValidationParameters
    {
        IssuerSigningKey = MagicFunction("hardcodedRSAModules","hardcodedRSA")
        ValidIssuer = "https://cognito-idp.us-east-2.amazonaws.com/{userpool}",
        ValidateIssuerSigningKey = true,
        ValidateIssuer = true,
        ValidateLifetime = true,
        ValidateAudience = false,
        ClockSkew = …
Run Code Online (Sandbox Code Playgroud)

.net jwt amazon-cognito .net-core jwk

7
推荐指数
1
解决办法
1272
查看次数

jwt.io 从哪里获取 JWT 令牌的公钥?

我正在通过jwt.io(在调试器部分)解码 JWT 令牌以查看标题、有效负载。令人惊讶的是,它还验证了,我可以看到它(jwt.io 调试器)也能够检索公钥。

所以我的问题是:JWT 令牌是否提供公钥以及 JWT 令牌的一部分?

我正在粘贴它的一部分(由于安全原因无法完全粘贴,将截断实际 JWT 令牌的一部分)

F3cy5jb21cL2V1LXdlc3QtMV9ZckVRYjY5Z1giLCJleHAiOjE2MDE2Mzg4OTMsImlhdCI6MTYwMTYzNTI5MywidmVyc2lvbiI6MiwianRpIjoiNmI2YmZiNmYtY2M0MS00N2Q5LWI0YzYtOTBmOGFmNWM2MjQ1IiwiY2xpZW50X2lkIjoiMTM0MWxxa3N1ZmUwbm1vaW9kdnRjc2t2cWIifQ.RtKfz54uBgSZ1gc4KRPjzL4dPe5AbH2YMJu-DDvIxBzgMjqT9q4ApGzcWYB62-MgDUf-F_hK0kF9eIwAi9fARhp 0HGGnyiuydW_our6zE3EphLvXQByTDY5xzOUuSvt7WbDZWeSfpHcjrBttRSJAPOsZ2gInafKjZgWKyGL4vJB9swEhOMSSpTQDGWKenJCyp4emhe8E4XGzYTo9WEb-Wqg6sI__LrusDNd917FaocPKBxA
Run Code Online (Sandbox Code Playgroud)

解码消息(再次被截断)

标题

{
  "kid": "cJ0PzkBXPyjX7FM67jcOECIY=",
  "alg": "RS256"
}
Run Code Online (Sandbox Code Playgroud)

有效载荷:

{
  "sub": "13lqs0moiodvtcskvqb",  
  "token_use": "access",  
  "scope": "example.com/Manage",  
  "auth_time": 1601293,  
  "iss": "https://cognito.eu.amazonaws.com/",  
  "exp": 1601638,  
  "iat": 10353,  
  "version": 2,  
  "jti": "cc1-47d9-b6-5c6245",  
  "client_id": "nmodvtcb"  
}
Run Code Online (Sandbox Code Playgroud)

在那里,可以看到公钥(被截断)


-----BEGIN PUBLIC KEY-----
QEFAAOCAQ8AMIIBCxmf9bakWk
556KYmIZB+Sy1ftkkGa4qlUsmRvcG2Hll+7HBWp1ao6MVLskjdaaKg8iH1Iz4DKG
lgqT/ndwhoxvTBuvm0X2CZoNzZn4S8wDTr78m/S/YegZRhv6y58gkiKSEmbbC/g5
Bp+AF88NwBvLm1jdd
-----END PUBLIC KEY-----

Run Code Online (Sandbox Code Playgroud)

jwt.io 中的调试器从哪里检索公钥?我无法理解这一点。

public-key jwt jwk jwt-auth

7
推荐指数
2
解决办法
3009
查看次数

com.nimbusds.jose.RemoteKeySourceException:无法检索远程 JWK 设置:主机名验证失败

我正在使用 Nimbus-JOSE-JWT 库(版本 4.39)。使用这个库,我尝试进行本地 JWT 令牌验证,该验证从 OAuth 授权服务器中拉取 JWK 集。

当我在 JSE 应用程序中运行我的代码时,它运行得很好,但是,当我在 WebLogic 12.1.3 中运行完全相同的代码(作为 JEE 应用程序的一部分)时,它无法运行,并出现以下异常:

com.nimbusds.jose.RemoteKeySourceException: Couldn't retrieve remote JWK set: Hostname verification failed: HostnameVerifier=weblogic.security.utils.SSLWLSHostnameVerifier, hostname=corpZ.oktapreview.com.
    at com.nimbusds.jose.jwk.source.RemoteJWKSet.updateJWKSetFromURL(RemoteJWKSet.java:141)
    at com.nimbusds.jose.jwk.source.RemoteJWKSet.get(RemoteJWKSet.java:219)
    at com.nimbusds.jose.proc.JWSVerificationKeySelector.selectJWSKeys(JWSVerificationKeySelector.java:129)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:323)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:284)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:275)
    at org.corpZ.sec.okta.OktaClient.getAccessTokenInfoLocally(Unknown Source)
    at org.corpZ.sec.okta.OktaClient.validateAccessTokenLocally(Unknown Source)
    at org.corpZ.sec.okta.TokenValidator.isTokenValid(Unknown Source)
    at org.corpZ.eis.ws.interceptor.WSInterceptor.handleRequest(WSInterceptor.java:126)
    at org.springframework.ws.server.endpoint.interceptor.DelegatingSmartEndpointInterceptor.handleRequest(DelegatingSmartEndpointInterceptor.java:78)
    at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:224)
    at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:173)
    at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88)
    at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:59)
    at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:292)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServ
Run Code Online (Sandbox Code Playgroud)

以下是我的代码中的 Maven 依赖项:

<dependency>
  <groupId>com.nimbusds</groupId>
  <artifactId>nimbus-jose-jwt</artifactId>
  <version>4.39</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

任何帮助都感激不尽。

谢谢。

java nimbus jwt jwk

6
推荐指数
1
解决办法
6799
查看次数

如何为 open id connect 生成众所周知的配置文件?

我们有一个 openid connect 的实现,它返回一个编码的 id 令牌,它运行良好并且已经运行了一段时间。然而,我们尝试使用 aws 中的 cognito 连接到它,经过一番尝试和错误后,我们发现缺少 .well-known/openid-configuration 文件。

该文件旨在包含有关调用 openid-connect 服务器的信息,包括 JWK 密钥。

我不明白 JWK 密钥,这意味着: 1. 如何生成它们 2. 一旦生成如何处理它们?3. 我们现有的 openid-connect 代码是否需要更改并使用 JWK 密钥?4. 有什么方法可以验证 openid-connect 配置吗?

我不久前曾问过类似的问题,但无济于事,只能重新访问。

谢谢凯文

我已经尝试过:在这里: https: //mkjwk.org/并单击“新密钥”,它返回我认为是网络密钥的内容..但是不知道我打算用它做什么或其他选项卡的含义是什么。

预期结果:期望 AWS Cognito 继续并允许其连接到我们的 open id connect 实施。目前仅收到有关缺少众所周知的配置文件的错误。

php jwt openid-connect jwk

6
推荐指数
2
解决办法
4188
查看次数

如何在 spring-security 5.2 中增加 RemoteJWKSet 缓存 TTL

我们正在使用 spring-security 5.2 通过 JWT 验证来保护我们的 REST API。

使用该spring:security:oauth2:resourceserver:jwt:jwk-set-uri属性,我们指示远程 JWKS 端点,该端点转换为 Spring,基于此 URI 创建一个 NimbusJwtDecoder。再往下,创建一个 RemoteJWKSet 对象,该对象缓存对 JWKS 端点的调用,默认 TTL 为 5 分钟。

有没有办法增加这个 TTL 来最小化远程调用?也许在DefaultJWKSetCache某处使用不同的 TTL注入一个新实例?将其尽可能长时间地保存在缓存中似乎是安全的,因为当我们收到一个带有未知孩子的令牌时,将恢复对 JWKS 端点的调用以更新密钥集。

检索密钥的调用堆栈如下

JwtAuthenticationProvider
  public Authentication authenticate(Authentication authentication)
    ...
      jwt = this.jwtDecoder.decode(bearer.getToken())
    ...

o.s.security.oauth2.jwt.NimbusJwtDecoder
    public Jwt decode(String token)
    ...
      Jwt createdJwt = createJwt(token, jwt);
    ...

    private Jwt createJwt(String token, JWT parsedJwt)
    ...
      JWTClaimsSet jwtClaimsSet = this.jwtProcessor.process(parsedJwt, null);
    ....

DefaultJWTProcessor
      public JWTClaimsSet process(final JWT jwt, final C context)
        ...
          if …
Run Code Online (Sandbox Code Playgroud)

spring-security jwt jwk nimbus-jose-jwt

6
推荐指数
2
解决办法
1935
查看次数

将 JWK json 转换为公钥 golang (lestrrat-go)

我使用 JWKS 格式从身份验证服务提供公钥,该公钥可用于验证来自该身份验证服务的令牌。但是,要执行验证,我需要从 JWK 重建公钥。我该如何转换它?

type JWKeys struct {
    Keys []JWKey `json:"keys"`
}

type JWKey struct {
    Kty string `json:"kty"`
    Use string `json:"use,omitempty"`
    Kid string `json:"kid,omitempty"`
    Alg string `json:"alg,omitempty"`

    Crv string `json:"crv,omitempty"`
    X   string `json:"x,omitempty"`
    Y   string `json:"y,omitempty"`
    D   string `json:"d,omitempty"`
    N   string `json:"n,omitempty"`
    E   string `json:"e,omitempty"`
    K   string `json:"k,omitempty"`
}

var PublicKey *rsa.PublicKey

func SetUpExternalAuth() {
    res, err := http.Get("my_url")

    if err != nil {
        log.Fatal("Can't retrieve the key for authentication")
    }

    bodyBytes, err := ioutil.ReadAll(res.Body)
    if err != …
Run Code Online (Sandbox Code Playgroud)

cryptography go pem public-key jwk

6
推荐指数
2
解决办法
1万
查看次数

如何将 JWK 转换为 PEM

这个问题更通用,而不是针对特定语言,因此我将解释我的问题以及我在伪代码中尝试过的内容。

我正在尝试从 JWK 集中生成 PEM 公钥。JWK 包括“e”(指数)和“n”(模)变量。我的问题是,在不使用任何库和 OpenSSL 命令行工具的情况下将此 JWK 转换为 PEM 的确切步骤是什么。

这是JWK供参考:

{
  "kty": "RSA",
  "alg": "RS512",
  "kid": "26887d3ee3293c526c0e6dd05f122df53aa3f13d7dad06d25e266fa6f51db79fb52422aaf79f121476237e98dcd6640350fee47fec70e783544ec9a36e4605bc",
  "use": "sig",
  "n": "14m79mVwIE0JxQdKrgXVf7dVcBS90U0TvG7Yf7dG4NJocz1PNUrKrzGhe_FryOe0JahL_sjA2_rKw7NBCpuVx_zSPFRw6kqjewGicjXGus5Fmlf3zDuqwV4BWIFHyQexMPOly0agFfcM0M0MgBULXjINgBs9MwnRv7JVfRoGqXHsNM45djFDd3o4liu4LPlge_DquZUFLNu-BYAyAlWkz0H2TepZhGrN9VEPmxzQkNzXc1R4MpZvbxrRRgaAA2z094ik3hk86JhfyFq-LDcueZhtshmrYZ95LWgMlQ7PixkeK1HkeEYMt20lmNzR8B8KabimYmibxA4Ay9gpRwfp-Q",
  "e": "AQAB"
}
Run Code Online (Sandbox Code Playgroud)

我的大部分研究源自node-jwk-to-pem库(可以在这里找到: https: //github.com/Brightspace/node-jwk-to-pem)和一个使用JOSE库的StackOverflow问题在 PHP 中(可以在这里找到:How to conversion a public key from a JWK into PEM for OpenSSL?

根据我通过阅读上述库(加上一些其他文章和问题,但没有完全提到逐步过程)所发现的,我发现第一步是将模数和指数转换为整数(特别是 BigInt)。这通常会导致以下结果:

n = 27209154847141595039206198313134388207882403216639061643382959557246344691110642716248339592972939239825436848454712213431917464875221502188500634554426063986720722251339335488215426908010590565758292169712942346285217861588132983738839891250753593240057639347814778952277719613395670962156961452389927728643840215833830614315091417876959205843957512422401240879135352731575182574836052718961865690645602829768565458494497550672252951063585023601307115444743487394113997186698238507983094748342588645472362960665610355698438390751920697759620235642103374737421940385132232531739910444003185620313592808726865629407737
e = 65537
Run Code Online (Sandbox Code Playgroud)

使用此信息,我将如何从指数和模数生成 PEM 公钥?任何伪代码或建议都将是令人难以置信的!

cryptography rsa pseudocode pem jwk

6
推荐指数
2
解决办法
1万
查看次数

Rails - 如何从 JSON Web 密钥获取公钥?

我从服务器获取了以下jwks

    "keys": [
        {
            "kty": "RSA",
            "e": "AQAB",
            "use": "sig",
            "alg": "RS256",
            "kid": "92595710205972640",
            "n": "l75bY3woSGVAYYDR6qE0tbzxqpYLr1-zz_ShSiFOOpa-taJenFWipHm7AR2GyG36bJeHgAo8OtqcTprWwHi3NjhxQZ0bj-hyr02ZxufvGnOIJzQgPsKym9jlWIXZSZ4apJI06RbaJ95Z9ekQ-36IR8NZ5VuV3aQZd753FDVjMciyqin6ofNSE5kq-fkWf4hbyEqgKFz4SeqjFhThhUaMrzs_uyNAZnaIzyAgxRmtMxJ5Mci8L7aX9DLhAMiUAOvSGGyRI1r9KlRxEcqNlFCdYi8G74ehPorwTY6-sW3ZG6U_sA5Ns9GUmuLIkSIbueqWv_tGxYcx4ntAO6zRQocinw"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个encoded_token。我想用上面的jwk解密它。如何从上面的jwk中获取公钥。我按照https://auth0.com/docs/quickstart/backend/rails/01-authorization中的步骤进行操作。但是上面的jwk中缺少x5c(证书)。

我想知道如何在 jwk 中没有 x5c 的情况下获取公钥。

rubygems ruby-on-rails jwt ruby-on-rails-5 jwk

5
推荐指数
1
解决办法
2765
查看次数

如何使用 ES256 alg 的 JWK 验证 JWT?

我有智威汤逊作为

var signedJwt = "eyJhbGciOiJFUzI1NiIsImtpZCI6IjZjNTUxNmUxLTkyZGMtNDc5ZS1hOGZmLTVhNTE5OTJlMDAwMSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1OTY3MzA4ODMsInJlcXVlc3RfYm9keV9zaGEyNTYiOiI4NDMyODhkMWMxYmM0NzhlMTBhOTM2NWQ1YjIzY2U5ZWZlY2E2ZjdkYjA3NDQ3Y2JmNjU4YTg3ZjEzZjI1ZjJmIn0.3yQY6gtNq0lQlx6eNLO_3coGqf2VkX2CBRWam9Lz0dcVvr8h4LkYfuZMwQf1fzZ_XXHEV_o17LciyBC-O72UUw"
Run Code Online (Sandbox Code Playgroud)

然后我得到一个公钥:

{
    "alg": "ES256",
    "created_at": 1560466143,
    "crv": "P-256",
    "expired_at": null,
    "kid": "6c5516e1-92dc-479e-a8ff-5a51992e0001",
    "kty": "EC",
    "use": "sig",
    "x": "35lvC8uz2QrWpQJ3TUH8t9o9DURMp7ydU518RKDl20k",
    "y": "I8BuXB2bvxelzJAd7OKhd-ZwjCst05Fx47Mb_0ugros"
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 C# 中的 Jose 库进行解码

var claims = Jose.JWT.Decode(signedJwt, publicKey, JwsAlgorithm.ES256);
Run Code Online (Sandbox Code Playgroud)

每次我收到错误时:

EcdsaUsingSha 算法期望密钥为 CngKey 或 ECDsa 类型。

我认为我使用密钥的方式不正确,但我找不到任何方法将 json 密钥转换为 pem 或任何有效的东西。

c# jwt jwk asp.net-core jose

5
推荐指数
1
解决办法
3669
查看次数

如何通过 shell 使用 openssl 库从 JWKS 中提取公钥

我从端点获取了 JWKS,它看起来像这样:

\n
{\n  "keys": [\n    {\n      "kty": "RSA",\n      "use": "sig",\n      "x5t": "M2maFm3VYlMBOn3GetVWGXkrKrk",\n      "kid": "SIGNING_KEY",\n      "x5c": "MIIC\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6(base64 encoded cert)\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6..tow==",\n      "alg": "RS256"\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

.pub我正在尝试使用 shell将此 x5c 值转换为公钥 ( ) 文件openssl

\n

我尝试复制粘贴x5c上述 json 中的值并.pem通过执行以下操作将其添加到文件中:

\n
vi certificate.pem\nfold -w 64 certificate.pem\n
Run Code Online (Sandbox Code Playgroud)\n

然后certificate.pem也在文件中添加以下内容

\n
-----BEGIN CERTIFICATE-----\n<value>\n-----END CERTIFICATE-----\n
Run Code Online (Sandbox Code Playgroud)\n

之后我尝试运行以下命令来获取公钥:

\n

openssl x509 -pubkey -inform pem -in certificate.pem -noout > key.pub

\n

但遇到类似这样的编码错误:

\n
unable to load certificate\n140735207381436:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1319:\n140735207381436:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested …
Run Code Online (Sandbox Code Playgroud)

shell openssl rsa x509certificate jwk

5
推荐指数
1
解决办法
1186
查看次数