Besoin de serialize un P11PrivateKey ou Keystore
Bonjour à tous,
Je me tourne vers vous pour avoir d'autres pistes à ma problématique pour laquelle je ne vois plus comment faire.
Le contexte :
- J'ai une applet Java qui lit un ensemble de certificats dans une SmartCard (carte à puce).
- J'ai un code Java distant (Java RMI), que j'appelle "code serveur", qui est en charge de la logique métier, notamment d'ouvrir et de maintenir des connexions TLS.
Le problème :
- Depuis l'applet je récupère un ensemble de certificats, notamment des objets de type : X509Certificate, PrivateKey, Certificate[], X509Certificate[]. La lecture fonctionne très bien.
- Lorsque je passe la PrivateKey en paramètre à ma fonction distante (Java RMI), je rencontre l'erreur suivante :
Code:
Communication RemoteException : error marshalling arguments; nested exception is: java.io.NotSerializableException: Cannot serialize sensitive and unextractable keys
La classe de ma PrivateKey est la suivante : class sun.security.pkcs11.P11Key$P11PrivateKey
Après recherches, il s'avère, sauf erreur de ma part, que la P11Key n'est pas sérializable, en tout cas qu'une exception est levée pour protéger ce contenu.
Autre possibilité, je pourrai "déporter" la lecture des certificats directement à mon "code serveur" qui se chargerait d'instancier directement les certificats et la PrivateKey P11Key.
Or, je ne suis pas sur de pouvoir également sérializer l'objet Keystore créé à ce niveau.
Voici l'extrait de code créant le Keystore à partir des données lues dans la carte à puce :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Provider p = Security.getProvider("SunPKCS11-CPS");
if(p==null){
StringBuilder cardConfig = new StringBuilder();
cardConfig.append("name = CPS\n");
cardConfig.append("library = " + pathCryptolib);
InputStream is = new ByteArrayInputStream(cardConfig.toString().getBytes());
Provider securityProvider = new sun.security.pkcs11.SunPKCS11(is);
Security.addProvider(securityProvider);
}
try {
KeyStore keystore;
keystore = KeyStore.getInstance("PKCS11");
keystore.load(null, codePinCarte);
// A ce niveau là, je souhaiterai éventuellement transmettre le Keystore qui doit être "chargé" des certificats de la carte à puce
} catch (Exception e) {
throw new Exception("Impossible de lire la carte : " + e.getMessage());
} |
Connaissez-vous un moyen qui me permettrait de réaliser la serialization de la PrivateKey ou du KeyStore ?
En vous remerciant par avance pour vos retours et idées constructives.
Bien cordialement,
Thec