java - openjdk1.7 : fail to list PKCS11 keystore aliases when BouncyCaSTLeProvider is used

标签 java

我想研究 nssdb keystore 以从可用别名中提取一些信息。在同一应用程序的其他部分,我使用 BouncyCaSTLeProvider 来处理其他一些安全问题。 下面的小代码显示了我如何加载和运行它,并且与 openjdk-1.6.0 配合良好。 现在,对于 openjdk-1.7.0,只有当我不使用 BouncyCaSTLeProvider 或在 PKCS11 提供程序之后添加此提供程序时,它才有效。 如果我在 PKCS11 之前添加 BC,一切似乎都可以(无异常(exception)),但 Keystore.aliases() 为我的 nss 容器返回一个空列表。就像如果 load() 不起作用一样。

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 结构。

最佳答案

我发现 - java.security 中的 SunPKCS11 实例化是 openjdk7 与 openJDK6 相比的变化。 - 通过 nss.cfg 加载我的 nssdb 而不是默认的“nodb”模式对于这个问题看起来没问题,但这不是有效的解决方法,因为会导致诸如 keytool 错误之类的副作用...

此外, - 我仍然不知道为什么 BouncyCaSTLeProvider 与 SunPKCS11 交互。 - 看起来 nssdb 不是通过 load() 方法加载的,而是在 SunPKCS11 实例化时加载的 - JVM 中只能加载一个具有单个 nssdb 的 SunPKCS11 实例

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

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

关于java - openjdk1.7 : fail to list PKCS11 keystore aliases when BouncyCaSTLeProvider is used,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269633/

相关文章:

java - 如何将数字格式化为一定数量的小数位加逗号分隔符?

java - InetAddress 对象在调用 isAnyLocalAddress() 时如何返回 true?

JavaFX Shape3D 对象不适用于 Android 手机

java - Kubernetes:将证书填充到 keystore 中

java - 使用配置文件构建 Maven 项目

java - 通过反射调用getter的最佳方式

java - 如何在 Swing 中分析 EDT?

java - 嵌入式 jetty 和 Jersey ,适用于 Jersey 2.7,2.9 除外

java - 具有接收者参数覆盖的方法是否等效于没有接收者参数的相同方法声明?

java - 多类 Java Applet