我正在尝试创建一个签名的 JWT ,但是当我尝试签署他的 JWT 时,我得到了以下异常,
Caused by: javax.crypto.BadPaddingException: RSA private key operation failed
at sun.security.rsa.RSACore.crtCrypt(RSACore.java:201)
at sun.security.rsa.RSACore.rsa(RSACore.java:122)
at sun.security.rsa.RSASignature.engineSign(RSASignature.java:192)
... 74 more
我有两个使用 RS256 alg 签署 JWT 的 JWK。两者的位大小均为 2048,但我能够使用其中一个成功签署 JWT,但不能与另一个签署。(不能共享 JWK)
我比较了 JWK 和 JWK JSON 中所有必需的键是相同的,但只有它们的模数和指数不同。
我无法理解导致问题的原因。
您可以使用以下代码复制问题:
KeyPairGenerator gen= KeyPairGenerator.getInstance("RSA");
gen.initialize(2048);
JWK sigJWK = new RSAKey.Builder((RSAPublicKey)gen.generateKeyPair().getPublic())
.privateKey((RSAPrivateKey)gen.generateKeyPair().getPrivate())
.keyUse(KeyUse.SIGNATURE)
.keyID("s1")
.algorithm(JWSAlgorithm.RS256)
.build();
Map<String, Object> jwkParamMap = JsonUtil.parseJson(sigJWK.toString());
PrivateKey sigKey= new RsaJsonWebKey(jwkParamMap).getRsaPrivateKey();
String tokenEndpoint = request.getAttribute("scheme") + "://" + request.getAttribute("ip") +
request.getAttribute("tokenurl");
Random randomInt=new Random();
JWTClaimsSet claims = new JWTClaimsSet.Builder()
.issuer(clientID)
.subject(clientID)
.audience(tokenEndpoint)
.jwtID("ItsmejwtID"+randomInt.nextInt())
.expirationTime(new Date(new Date().getTime()+ 120* 1000))
.build();
JWSSigner signer = new RSASSASigner(sigKey);
SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claims);
signedJWT.sign(signer);
return signedJWT.serialize();