2014-06-17 93 views
1

我想查看一个nssdb密钥库以从可用别名中提取一些信息。在同一个应用程序的其他部分,我使用BouncyCastleProvider来处理一些其他安全问题。 下面的小代码显示了我如何加载并运行它,并且与openjdk-1.6.0配合良好。 现在,使用openjdk-1.7.0,只有在不使用BouncyCastleProvider或者在PKCS11提供程序后添加此提供程序时,它才有效。 如果我在PKCS11之前添加BC,一切似乎都没问题(没有例外),但Keystore.aliases()会为我的nss容器返回一个空列表。就好像load()没有工作。openjdk1.7:使用BouncyCastleProvider时未能列出PKCS11密钥库别名

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(); 
    } 

} 
} 

任何想法是值得欢迎...

注:/ nssdbpath包含使用的certutil一个nssdb结构创建。

回答

0

我发现 - java.security中的SunPKCS11 instanciation与openJDK6相比是openjdk7中的一个变化。 - 通过nss.cfg而不是默认的“nodb”模式加载我nssdb看起来确定这件事情,但是这是没有有效的解决方法,因为造成的副作用,如keytool的错误...

此外, - 我仍然不知道为什么BouncyCastleProvider与SunPKCS11交互。 - 它看起来nssdb不受load()方法,而是在SunPKCS11 instanciation 加载 - 只有一个SunPKCS11实例与单个nssdb可以在JVM

=> SunPKCS11加载是不要去读取好办法我的nssdb数据:我将通过外部(非java)代码作为解决方法。

无论如何,如果有人有另一种解决方案,我仍然有兴趣阅读。

相关问题