我想查看一个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结构创建。