Bonjour à tous,
Toujours dans ma quête de gestion des différents keystore, je suis entrain de réaliser quelque test pour charger le Keystore du client de messagerie "Evolution" (qui était à la base sous Linux mais qui est disponible sous windows)
Mon premier but est donc de charger le keyStore et de lister les certificat présent. Je vais vous exposer mon raisonnement par étape pour me faire comprendre le mieux possible !
Pour ceux qui ne connaissent pas Evolution sous Windows, les répertoires utilisés sont :
----> C:\Document and Settings\user\.evolution
dans ce répertoire on retrouve les key3.db, secmod.db et cert8.db
----> c:\program file\DIP Consultant\Evolution
avec dans ce répertoire un autre répertoire bin, dans lequel on retrouve les dll de type nss3.dll ect...
déjà premier étape, Evolution ne semble plus subir "d'évolution" sous wundows... j'ai donc du remplacer le nss3.dll par un plus récent car les fonction utilisé n'était pas présente dans l'ancienne version
Passons au code :
Pour charger mon Keystore j'utilise ceci
avec un fichier de configuration de ce type :
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
20
21
22 public KeyStore chargerKeystore2(String Pass){ KeyStore ks = null; try{ String configName = f.getAbsolutePath(); sun.security.pkcs11.SunPKCS11 p = new sun.security.pkcs11.SunPKCS11(configName); Security.addProvider(p); try { KeyStore.PasswordProtection pwd = new KeyStore.PasswordProtection(Pass.toCharArray()); ks = KeyStore.getInstance("PKCS11", p); ks.load(null, pwd.getPassword()); } catch (Exception e) { e.printStackTrace(); System.out.println("Wrong password"); } }catch(Exception e){ e.printStackTrace(); } return ks; }
Alors voila mon analyse :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4name=IASNSS nssLibraryDirectory=C:/Program Files/DIP Consultants/Evolution/bin nssSecmodDirectory ="C:/Documents and Settings/user/.evolution"
Lorsque l'on importe manuellement un certificat (en allant dans les préférence d'évolution et en choisissant un format PKCS12), lors du premier Import, Evolution demande un mot de passe pour protéger le keystore et ensuite le mot de passe du fichier PKCS12
Imaginons que je met comme mot de passe pour le keystore "0000"
Lorsque je lance mon application Java avec le mot de pass "0000" tout fonctionne très bien.
Voila la fin de partie "Traitement réussi"
Maintenant Passons au traitement qui ne réussit pas
Si la personne vient d'installer Evolution, au lancement du soft, les cert8.db et compagnie sont créer
Par contre si je lance directement mon application par la suite, je me prend une première erreur
au niveau de cette ligne :
Exception de type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ks.load(null, pwd.getPassword());
après recherche cela vient du fait que le mot de passe du keystore n'a pas été initialisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sun.security.pkcs11.wrapper.PKCS11Exception: CKR_USER_TYPE_INVALID
Ce qui est normal puisque aucun certificat n'a été importé, le keystore n'a jamais eu sont mot de passe principal d'initialisé.
Donc après tout ce long discour, je me retrouve avec ce problème de mot de passe de keystore non initialisé.
J'ai essayé avec
mais je me prend l'exception suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ks.load(null, null);
si je comprend bien,il ne trouve pas de mot de passe à passer en paramètre et il ne trouve rien qui puisse être exécuter pour demander le mot de passe à l'utilisateur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2javax.security.auth.login.LoginException: no password provided, and no callback handler available for retrieving password
je me suis dit que je pourrai réaliser cette demande de mot de passe moi même par contre je ne voit pas du tout comment le transmettre au keystore ?
Voila mon problème, j'espère que le discours n'a pas été trop long et que j'ai réussi à vous exposer clairement ce qui cloche !
merci pour toute l'aide apportée.
Partager