2011-01-14 151 views
2

我正在开发这个应用程序,特别用于Firefox(这是内部使用)。基本上,我们使用sun.security来读取Firefox的KeyStore并使用我们获得的证书签署数据。使用sun.security.pkcs11.SunPKCS11的奇怪问题:无法找到指定的程序?

我在几台机器上测试过这个,结果不一样,我似乎无法找到原因。

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

还有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 

我希望有人将有一个线索,或许与调试进一步得到一些提示。我在这里不知所措。

回答

1

我很可能已经太晚了,因为这对您没有用处,但我遇到了类似问题,并且在我的PATH中添加dist\WINXXX_DBG.OBJ\lib可解决此问题。

0

快速回答:使用86 JDK不是64 JDK与NSS和JSS

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

的keytool -list -v -storetype PKCS11 -providerClass太阳.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文件都存在于路径中。特别是,modutil.exe会在没有chk文件的情况下失败某些命令,并且错误消息不会有帮助。您的NSS lib文件夹需要包含NSS和NSPR lib文件夹,jss4.dll和jss4.lib文件以及jss4.jar。

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