Bonjour,
J'ai un jeton au format JWT à crypter en RSA256.

J'utilise donc ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
JWEHeader header = new JWEHeader(JWEAlgorithm.RSA_OAEP, EncryptionMethod.A256GCM);
// "typ": "JWT"
header.setType(new JOSEObjectType("JWT"));
// "x5t":identifiant du certificat
header.setX509CertThumbprint(new Base64URL("monCertificat"));
 
JWTClaimsSet claimSet =  new JWTClaimsSet();
 
// sets sur claimSet			
 
Map<String, Object> customClaims = new HashMap<String, Object>();
 
// sets sur customClaims
 
claimSet.setCustomClaims(customClaims);
 
EncryptedJWT jwt = new EncryptedJWT(header,claimSet);
Je souhaite maintenant chiffrer avec mon certificat (fichier monCertificat.pem) qui est de la forme suivante:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Le contenu de ce certificat est je présume en Base64.

J'ai essayé ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
String filename = "C:/xxx/monCertificat.pem"; 
File file = new File(filename);
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int)file.length()];
dis.readFully(keyBytes);
dis.close();
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey publicKey =  (RSAPublicKey)keyFactory.generatePublic(spec);
RSAEncrypter encrypter = new RSAEncrypter(publicKey);
jwt.encrypt(encrypter);
String jwtString = jwt.serialize();
J'ai l'exception suivante sur "keyFactory.generatePublic(spec)":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
java.security.spec.InvalidKeySpecException: Inappropriate key specification: invalid key format
Je ne comprend pas quoi faire pour que ca fonctionne et suis un peu perdu entre certificat, clé publique pour chiffrer...

Est-ce que vous pouvez m'aider svp?

Edit:

J'ai changé l'algo pour le chiffrage du jeton comme ceci afin d'utiliser CertificateFactory qui permet apparament d'xploiter les certificats pem:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
String filename = "C:/xxx/monCertificat.pem"; 
File file = new File(filename);
CertificateFactory fact = CertificateFactory.getInstance("X.509");
FileInputStream is = new FileInputStream (file);
X509Certificate cer = (X509Certificate) fact.generateCertificate(is);
RSAPublicKey publicKey = (RSAPublicKey) cer.getPublicKey();
RSAEncrypter encrypter = new RSAEncrypter(publicKey);
jwt.encrypt(encrypter);
String jwtString = jwt.serialize();
Je n'ai plus d'erreur et j'obtiens une clé publique. Cela vous semble t-il correct?