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 :
La classe de ma PrivateKey est la suivante : class sun.security.pkcs11.P11Key$P11PrivateKey
Code : Sélectionner tout - Visualiser dans une fenêtre à part Communication RemoteException : error marshalling arguments; nested exception is: java.io.NotSerializableException: Cannot serialize sensitive and unextractable keys
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 : 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
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
Partager