我正在开发此应用程序,以便与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
我希望有人会有一些线索,或者有一些关于进一步调试的提示。我在这里不知所措。
答案 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出现问题。