JWT を送信するリモート アプリケーションがあります。彼らは「RSA-OAEP-256」アルゴリズムと「A256CBC-HS512」暗号化、そして私たちの公開鍵を使用してトークンをエンコードしました。今、私はそれを解読してクレームを解析しようとしています。でキーを生成し、この SO投稿の提案に基づいて .deropenssl rsa -in <myPrivateKey> -pubout -out <myPublicKey>
に変換しました。nimbusのガイドに従って、次のことを思いつきました。myPrivateKey
@Test
public void testDecryptJwtWithRsa() {
String filename = <myPrivateKey.der>;
String tokenString = <encryptedTokenString>;
try {
byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(spec);
byte[] encodedPk = pk.getEncoded();
JWEObject jweObject = JWEObject.parse(tokenString);
jweObject.decrypt(new DirectDecrypter(encodedPk));
SignedJWT signedJWT = jweObject.getPayload().toSignedJWT();
String jsonToken = jweObject.getPayload().toJSONObject().toJSONString();
System.out.println(jsonToken);
} catch (Exception e) {
System.out.println(e.getMessage());
Assert.fail();
}
}
java.security.PrivateKey は正しく解析されますが、次の場所でエラーが発生しますjweObject.decrypt(new DirectDecrypter(encodedPk));
:
The Content Encryption Key length must be 128 bits (16 bytes), 192 bits (24 bytes), 256 bits (32 bytes), 384 bits (48 bytes) or 512 bites (64 bytes)
また、デバッガーでjwe.payload
は、null であることがわかりますが、復号化の前にこれを入力する必要があるかどうかはわかりません。
別の方法でキーを生成する必要がありますか、または省略した別の手順がありますか? どこかでアルゴリズムを指定する必要がありますか、それとも別の復号メソッド/クラスを使用する必要がありますか?