2011-01-14 150 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出現問題。