【问题标题】:Validating jwt in java: Key bytes cannot be specified for RSA signatures在 java 中验证 jwt:无法为 RSA 签名指定密钥字节
【发布时间】:2017-01-30 00:44:22
【问题描述】:

我从 OAuth 服务器收到 jwt(访问令牌)。 OAuth 服务器已经为我提供了密钥、公钥和自签名 CA 证书。

我想编写一个代码,当我收到 jwt 时,我可以验证它并检查此服务器是否已将它发送给我。我使用以下代码在 java 中验证我的 jwt。

String jwt = "xxx.yyy.zzz";

        //This line will throw an exception if it is not a signed JWS (as expected)
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(self_signed_CA_Certificate))
                .parseClaimsJws(jwt).getBody();

我收到错误:Key bytes cannot be specified for RSA signatures. Please specify a PublicKey or PrivateKey instance.

感谢任何帮助。

【问题讨论】:

    标签: java jwt


    【解决方案1】:

    我遇到了同样的问题,这是我的解决方案

    在我的情况下,我得到了一个证书,可以使用不同的密钥进行签名,

       CertificateFactory fact = CertificateFactory.getInstance("X.509");
       FileInputStream is = new FileInputStream ("yourcertificate.jks");
       Certificate cer = fact.generateCertificate(is);
       PublicKey  publicKey = cer.getPublicKey();
    

    然后验证使用的 jwt 令牌:

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

    【讨论】:

      【解决方案2】:

      您必须像

      一样使用 RSA 创建 secretKey
      SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); 
      or 
      Key secretKey = MacProvider.generateKey();
      

      使用相同的密钥生成 jwt 字符串并使用相同的密钥解密它,如

      SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
      String compactJws = Jwts.builder()
                        .setSubject("Joe")
                        .signWith(SignatureAlgorithm.HS512, secretKey)
                        .compact();
      
      
      Claims claims = Jwts.parser().setSigningKey(secretKey)
                              .parseClaimsJws(compactJws).getBody();
      

      【讨论】:

      • 您不需要再次创建密钥。您是否尝试使用自签名 CA 证书密钥。如果他们给了您有效的密钥,它应该可以工作。在您的代码中,您尝试使用“秘密”,它不是有效的 RSA 密钥。这就是为什么你会出错。
      • 我尝试了你的建议:Claims claim = Jwts.parser().setSigningKey(self_signed_CA_Certificate) .parseClaimsJws(jwt).getBody();但仍然得到同样的错误。难道是我应该给编码?例如类似于使用 DatatypeConverter.parseBase64Binary?
      • self_signed_CA_Certificate 是字符串还是密钥对象?如果它是 id 字符串,那么你可以通过 DatatypeConverter.parseBase64Binary
      • 它是一个字符串。 DatatypeConverter.parseBase64Binary 导致相同的错误。我从证书中删除了字符串 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- ,可以吗?
      • 谢谢。我试过了,还是一样的错误。你不认为我应该在某个地方提供公钥吗?这就是错误的意思。
      猜你喜欢
      • 2020-10-01
      • 2019-06-20
      • 2015-09-20
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多