Certificat et cryptage de jeton au format JWT
Bonjour,
J'ai un jeton au format JWT à crypter en RSA256.
J'utilise donc ceci:
Code:
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:
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:
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:
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?