在java中验证jwt:无法为RSA签名指定密钥字节

时间:2016-09-21 16:39:21

标签: java jwt

我从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.

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

在我的情况下,我获得了一个证书,该证书提供了可以用不同密钥签名的功能,

   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();

答案 1 :(得分:-1)

你必须使用RSA创建secretKey,如

SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); 
or 
Key secretKey = MacProvider.generateKey();

使用相同的secretKey密钥生成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();