3

我的客户向我发送了一个 JWT,我需要使用他们的公钥验证这个 JWT。我正在使用 Java 和 JJWT 框架来验证这个令牌。我知道使用 HS256 解码此令牌,但我不知道使用 RS256。

他们的配置是:

在此处输入图像描述

在这里编辑以改进我的问题。我正在使用的 jjwt 解析示例:

        Claims String secret = "-----BEGIN CERTIFICATE-----myx5ckey-----END CERTIFICATE-----"
    byte[] dataBytes = Base64.getEncoder().encode(secret.getBytes());
    byte[] byteKey = Base64.getDecoder().decode(dataBytes);
    X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    PublicKey publicKey = kf.generatePublic(X509publicKey);

    Claims body = null;
    body = Jwts.parser().setSigningKey(publicKey.getEncoded())
            .parseClaimsJws(idToken)
            .getBody();


java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)

如何使用我显示的 JWKS 信息验证收到的令牌?(上图)

4

2 回答 2

4

我解决了我的问题。

String secret2 = "myX5c";
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        Certificate certificate = cf.generateCertificate(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(secret2)));
        PublicKey publicKey = certificate.getPublicKey();


        Claims body = null;
        body = Jwts.parser().setSigningKey(publicKey)
                .parseClaimsJws(idToken)
                .getBody();

@KcDoD 感谢您的提示。

于 2018-02-17T15:18:08.683 回答
3

tldr; 需要遵循三个步骤

  1. 从JWK提取公钥可能会通过发现文档或任何其他方式。
  2. 按照JWS 规范的描述提取 JWS 签名和 JWS 签名输入
  3. 将公钥、JWS 签名和 JWS 签名输入传递给签名验证者

根据库,步骤 2 和 3 可以一步完成。!

长答案

要验证您必须遵循 JWS 规范。

RFC7515中定义的 JWS 规范解释了如何创建验证令牌所需的 JWT 的 MAC。该协议的附录 2解释了如何使用 RS256 创建 MAC 并对其进行验证。

使用发现信息,您必须识别公钥。现在,您已经收到了作为JWK的关键详细信息。根据x5x上的 JWK 协议定义,

“x5c”(X.509 证书链)参数包含一个或多个 PKIX 证书链

所以基本上你在 JWK 中有公钥。现在您需要将 x5x 的编码字符串转换为公钥。为此,请检查这个已经回答的问题

构造公钥后,使用它来验证令牌。以下是从规范中提取的。

A.2.2。证实

由于“alg”标头参数是“RS256”,我们验证 JWS 签名中包含的 RSASSA-PKCS1-v1_5 SHA-256 数字签名。

验证 JWS 签名与前面的示例有些不同。我们传递公钥 (n, e)、JWS 签名(它是从 JWS 表示中编码的值解码的 base64url)和 JWS 签名输入(它是 JWS 紧凑序列化表示的初始子字符串,直到但不是包括第二个句点字符)到已配置为使用 SHA-256 哈希函数的 RSASSA-PKCS1-v1_5 签名验证器。

为了验证,最好使用库。作为参考,这里是如何使用nimbus完成的链接

于 2018-02-16T04:58:31.417 回答