2014-06-17 2 views
1

Je souhaite examiner un keystore nssdb pour extraire des informations sur les alias disponibles. Sur une autre partie de la même application, j'utilise BouncyCastleProvider pour gérer d'autres choses de sécurité. Le petit code ci-dessous montre comment je le charge et le cours, et fonctionnait bien avec openjdk-1.6.0. Maintenant, avec openjdk-1.7.0, cela ne fonctionne que si je n'utilise pas le BouncyCastleProvider ou si ce fournisseur est ajouté après le fournisseur PKCS11. Si j'ajoute BC avant PKCS11, tout semble correct (sans exception), mais Keystore.aliases() renvoie une liste vide pour mon conteneur nss. Tout comme si load() ne fonctionnait pas.openjdk1.7: Echec de la liste des alias keystore PKCS11 lorsque BouncyCastleProvider est utilisé

import java.io.InputStream; 
import java.io.ByteArrayInputStream; 
import java.util.Enumeration; 
import java.security.KeyStore; 
import java.security.Provider; 
import java.security.Security;  
import java.security.cert.X509Certificate; 
import java.security.cert.Certificate; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 

public class TestNSS { 
public static void main(String[] args) { 
    try { 
     Provider prov = new BouncyCastleProvider(); 
     Security.addProvider(prov); 

     String config = "name = nssdb\n"; 
     config += "nssSecmodDirectory = /nssdbpath\n"; 
     InputStream stream = new ByteArrayInputStream(config.getBytes("UTF-8")); 
     Provider nss = new sun.security.pkcs11.SunPKCS11(stream); 
     stream.close(); 
     Security.addProvider(nss); 

     KeyStore ks = KeyStore.getInstance("PKCS11", "SunPKCS11-nssdb"); 
     ks.load((InputStream)null, "".toCharArray()); 
     System.out.println("load is ok: SunPKCS11-nssdb"); 
     for (Enumeration<String> e = ks.aliases(); e.hasMoreElements();) { 
      String alias = e.nextElement(); 
      Certificate cert = ks.getCertificate(alias); 
      System.out.println(" . alias: "+alias+", "+cert.getType()+","+((X509Certificate)cert).getNotAfter()); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

} 
} 

Toute idée est la bienvenue ...

Note:/nssdbpath contient une structure créée en utilisant nssdb certutil.

Répondre

0

J'ai trouvé que - l'instanciation de SunPKCS11 dans java.security est un changement de openjdk7 comparé à openJDK6. - chargement mon nssdb par nss.cfg au lieu de la valeur par défaut en mode « NODB » semble ok pour cette question, mais ce n'est pas de solution valable, car causant des effets secondaires comme des erreurs keytool ...

De plus, - je encore Je ne sais pas pourquoi BouncyCastleProvider interagit avec SunPKCS11. - il semble nssdb est pas chargé par la méthode de charge(), mais plutôt à SunPKCS11 instanciation - une seule instance SunPKCS11 avec un seul nssdb peut être chargé dans une machine virtuelle Java

=> SunPKCS11 est pas la bonne façon d'aller lire mes données nssdb: Je vais passer par le code externe (non-java) comme solution de contournement.

De toute façon, si quelqu'un a une autre solution, je suis toujours intéressé par la lecture.

Questions connexes