2013-04-12 133 views
61

我提供了一個名爲ABCC_client.store的jks密鑰庫。當我將這個密鑰庫導入cacerts並嘗試連接它時,表示沒有這樣的算法錯誤。 PFA堆棧跟蹤導致:java.security.UnrecoverableKeyException:無法恢復密鑰

Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) 
    at java.security.Provider$Service.newInstance(Provider.java:1245) 
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:220) 
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:147) 
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125) 
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68) 
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102) 
    at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61) 
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79) 
    ... 32 more 
Caused by: java.security.UnrecoverableKeyException: Cannot recover key 
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:311) 
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:121) 
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:38) 
    at java.security.KeyStore.getKey(KeyStore.java:763) 
    at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:113) 
    at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:48) 
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:239) 
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:170) 
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at java.lang.Class.newInstance0(Class.java:355) 
    at java.lang.Class.newInstance(Class.java:308) 
    at java.security.Provider$Service.newInstance(Provider.java:1221) 
    ... 39 more 

但是,如果我獨立使用此密鑰庫,即不將它添加到cacerts,它就可以工作。

一些谷歌搜索導致我到http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/其中說,密碼可能不同的密鑰和密鑰庫。

+0

有點代碼可以查看所謂的如果可能? – Bruno

+0

我正在嘗試從代碼中調用Web服務方法.. AxisFault faultCode:{http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString:java.net.SocketException :java.security.NoSuchAlgorithmException:構造實現時出錯(算法:默認,提供程序:SunJSSE,類:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) –

+2

可能在此複製的是類似的[question](http:///stackoverflow.com/questions/1321557/can-not-get-key-from-keystore)與asnwer。 – icrovett

回答

57

你的app/config中定義的私鑰密碼不正確。首先嚐試通過更改另一個驗證私鑰密碼,如下所示:

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password 

上面的示例將密碼從密碼更改爲changeit。如果私鑰密碼是密碼,則此命令將成功。

+1

雖然我沒有使用這個問題的答案。這有助於驗證密鑰庫文件,存儲密碼,別名/密鑰和密鑰密碼。 – Russ

+0

請記住,執行此命令後,您將更改密鑰庫密碼。您將不得不將密碼設回原來的密碼。 – gersonZaragocin

+0

實際上,只需指定'-keypasswd -keystore storefile -alias somealias'並在提示中輸入其他所有內容即可。 –

85

如果使用Tomcat 6及更早版本,請確保密鑰庫密碼和密鑰密碼相同。如果使用Tomcat 7及更高版本,請確保它們相同或在server.xml文件中指定了密鑰密碼。

+9

這是事實。參考https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore – Atharva

+1

相關報價:最後,系統會提示您輸入*密碼*,該密碼專門用於此證書(而不是存儲在同一密鑰庫文件中的任何其他證書)。您**必須**在此處使用與密鑰庫密碼本身相同的密碼。這是Tomcat實施的限制。 (目前,'keytool'提示符會告訴你,按下ENTER鍵會自動執行此操作。) –

+0

我有這個問題w JMeter(https)因爲Java密鑰庫和密鑰密碼不同。 Ref https://stackoverflow.com/questions/2889238/keystore-change-passwords?noredirect=1&lq=1。更改密鑰來解決問題。很好的幫助!謝謝。 – Rishi

5

當我們將密鑰導入使用64位OpenSSL版本構建的密鑰庫時,我遇到了同樣的錯誤。當我們按照相同的步驟將密鑰導入使用32位OpenSSL版本構建的密鑰庫時,一切都很順利。

+2

上述錯誤的根本原因是java.security.UnrecoverableKeyException:Can not恢復密鑰。其原因可能是上面提到的錯誤密碼,也可能是使用64位OpenSSL實現構建的密鑰庫。所以我認爲我的答案是另一種可能的解決方案它在相同的錯誤情況下幫助我,所以我在這裏提供瞭解決方案。 – Heimi

+0

openssl不會創建Java密鑰庫文件。你能澄清一下嗎? –

+0

Thks for you answer。從OpenESB 3.05調用https webservices時,我面臨同樣的問題。我按照你的指示,再次用32位的OpenSS生成jks文件,它工作正常 –

5

爲了不存在Cannot recover key異常,我必須將Java密碼擴展(JCE)無限強度管轄策略文件應用於正在運行我的應用程序的Java的安裝。可以找到這些文件的第8版here或最新版本應在this page上列出。下載包括一個文件,解釋如何應用策略文件。


由於JDK 8u151沒有必要添加策略文件。相反,JCE轄區政策文件由名爲crypto.policy的安全屬性控制。將其設置爲unlimited,允許JDK使用無限加密技術。由於發佈說明鏈接到上述狀態,因此可以通過Security.setProperty()或通過java.security文件進行設置。 java.security文件也可以添加-Djava.security.properties=my_security.properties作爲詳細的here啓動程序的命令。


既然JDK 8u161默認啓用無限加密。

+0

我看到這個錯誤,儘管安裝了策略文件的jar包。 – Adam

+0

@Adam我的解決方案適用於特定情況,可能與您遇到的情況有所不同。不過,我添加了一個更新以反映JDK 8u151中發生的更改。 – WhiteKnight

相關問題