4

我几乎对这个失去了希望。我正在尝试通过 PKCS#11 使用 Firefox 安装随附的 NSS 库从 Java 7 访问 Firefox 信任库。

这是代码:

import java.security.KeyStore;
import java.security.Security;
import java.util.Enumeration;
import sun.security.pkcs11.SunPKCS11;

public class Test {

    public static void main(String[] args) throws Exception {
        String configName = "pkcs11.cfg";
        SunPKCS11 p = new SunPKCS11(configName);
        Security.addProvider(p);
        KeyStore ks = KeyStore.getInstance("PKCS11", p);
        ks.load(null,  "apassword".toCharArray());
        System.out.println("Size: " + ks.size());
        Enumeration<String> aliases = ks.aliases();
        while (aliases.hasMoreElements()) {
            System.out.println(aliases.nextElement());
        }
    }
}

以下是 PKCS#11 配置的内容:

name = NSS
nssLibraryDirectory = /usr/lib/firefox/
nssSecmodDirectory = "/home/bogdan/.mozilla/firefox/x5d8wol9.default/"
nssModule =trustanchors
showInfo = true

当我运行应用程序时,我还设置了属性-Djava.library.path=/usr/lib/firefox/

当我运行应用程序时,我得到以下信息:

NSS modules: [NSS Internal PKCS #11 Module (CRYPTO, /usr/lib/firefox/libsoftokn3.so, slot 0), NSS Internal PKCS #11 Module (KEYSTORE, /usr/lib/firefox/libsoftokn3.so, slot 1)]
Exception in thread "main" java.security.ProviderException: NSS module not available: trustanchors
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:271)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
    at Test.main(Test.java:11)

您实际上可以看到“trustanchors”模块在初始化步骤没有加载,但我不知道为什么。这里的文档:http: //docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html#NSS

如果 secmod.db 已配置为包含信任锚库,则 trustanchors 模块允许通过 PKCS11 KeyStore 访问 NSS 信任锚证书。

但我不知道这意味着什么。值得注意的是,我在 Windows XP 32 位和 Ubuntu 11.10 64 位上都得到了相同的行为。pkcs11.cfg 似乎是正确的,就好像我更改了应用程序将因其他错误而失败的任何路径一样。

有什么好主意吗?

4

1 回答 1

1

我最终通过使用 JSS4 Mozilla 库设法解决了这个问题。如果要使用它,请确保下载 JSS4 JAR 以及本机库实现以及它具有的其他依赖项 - NSPR 和 NSS 本机库。

确保在 Linux 上,本机库的位置在 LD_LIBRARY_PATH 中,在 Windows 上,它们的位置在 %PATH% 变量中。您可能很想使用 Firefox 发行版附带的 DLL/SO。这在我发现的 Windows 上不起作用(与我认为它们是为 WIN95 平台编译的事实有关)

其余信息在 JSS4 库的文档中,但您基本上需要使用org.mozilla.jss.CryptoManager该类。

于 2012-05-09T13:46:55.950 回答