使用sun.security.pkcs11.SunPKCS11的奇怪问题:找不到指定的程序?

时间:2011-01-14 15:13:39

标签: java security firefox applet

我正在开发此应用程序,以便与Firefox一起使用(它可供内部使用)。基本上,我们使用sun.security来读取Firefox的KeyStore,并使用我们获得的证书对数据进行签名。

我已在多台机器上对此进行了测试,结果各不相同,我似乎无法确定原因。

我已经在最新的ubuntu版本Firefox 3.6.13上使用Java版本1.6.0_22进行了测试,它在那里工作。我也有一台Windows XP笔记本电脑使用相同的Firefox版本,使用的是Java版本1.6.0_17,它也适用。

还有其他2台Windows XP笔记本电脑无法使用,会出现同样的错误。他们正在运行相同版本的Firefox并使用java版本1.6.0_17。

错误是:

java.security.ProviderException: Could not initialize NSS
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:183)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:86)
    at SignedMessage.SigningApplet.initializeCrypto(SigningApplet.java:327)
    at SignedMessage.SigningApplet.init(SigningApplet.java:84)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: The specified procedure could not be found.
    at sun.security.pkcs11.Secmod.nssLoadLibrary(Native Method)
    at sun.security.pkcs11.Secmod.initialize(Secmod.java:186)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:179)
    ... 5 more
Exception: java.security.ProviderException: Could not initialize NSS

据我所知,它无法找到原生的nssLoadLibrary例程?配置文件将其指向Firefox安装目录(它可以获取nss3.dll或libnss3.so文件)。它在所有PC上执行此操作,并且配置中的所有路径似乎都有效。

示例配置文件,了解它的价值:

name=NSS
nssDbMode=readOnly
nssModule=keystore
nssSecmodDirectory="C:\\Documents and Settings\\user\\Application     Data\\Mozilla\\firefox\\Profiles/8bzd2qqm.default"
nssLibraryDirectory=C:\Program Files\Mozilla Firefox

我希望有人会有一些线索,或者有一些关于进一步调试的提示。我在这里不知所措。

2 个答案:

答案 0 :(得分:1)

我可能为时已晚太晚了,但是我遇到了类似的问题,并且在我的PATH中添加dist\WINXXX_DBG.OBJ\lib解决了这个问题。

答案 1 :(得分:0)

快速回答:使用 x86 jdk 而不是使用NSS和JSS的x64 jdk

针对NSS证书数据库的快速测试:

  

keytool -list -v -storetype pkcs11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg NSS_CONFIG_FIPS

其中NSS_CONFIG_FIPS是指向NSS数据库的配置文件的路径。如果是JDK问题,此命令将失败,堆栈跟踪与提问者错误匹配,如果JDK配置正确(如果配置文件正确),则该命令将失败

请注意,我的堆栈跟踪包含以下消息:

  

引起:java.io.IOException:%1不是有效的Win32应用程序。

我在NSS dll上运行了dumpbin / headers,发现Mozilla构建的二进制文件都是32位。我安装了x86 jdk并重新命名了JAVA_HOME。一切都开始奏效了。

对于Vivek来说,NSS和随附的可执行文件对库的存在非常敏感。确保路径中存在所有.dll,.lib和.chk文件。特别是,如果没有chk文件,modutil.exe将失败某些命令,并且错误消息没有帮助。您的NSS lib文件夹需要包含NSS和NSPR lib文件夹,jss4.dll和jss4.lib文件以及jss4.jar。

另请注意,如果您自己构建NSS,则不会使用经过批准的代码签名证书对该库进行签名,这将导致JCA出现问题。