2013-04-12 36 views
61

ABCC_client.store adlı bir jks anahtar deposuyla birlikte verilmiş. Ben bu anahtar deposu ithal etmek ve bağlamaya çalıştığınızda, "Böyle bir Algoritma hatası yok" diyor. PFA StackTraceNedeniyle: java.security.UnrecoverableKeyException: Anahtar Kurtarılamıyor

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 

Ama çalıştığını cacerts için eklemeden bağımsız yani bu anahtar deposunu kullanmak faydalı olacaktır.

Bazı içerikler bana şifre ve anahtar deposu için farklı olabilir diyor http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ yol açtı.

+0

Mümkünse neyin çağrıldığını görmek için biraz kod? – Bruno

+0

Kod içinden bir web hizmeti yöntemini çağırmaya çalışıyordum..AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.net.SocketException : java.security.NoSuchAlgorithmException: Hata uygulanmasını inşa (algoritması: Varsayılan, sağlayıcı: SunJSSE, sınıf: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) –

+2

burada aynen olamayacaklarınız benzer [soru] (http://stackoverflow.com/questions/1321557/can-not-get-key-from-keystore) bir asnwer ile. – icrovett

cevap

57

Uygulamanızda/yapılandırmanızda tanımlanan özel anahtar parolası yanlış. İlk aşağıdaki gibi bir diğerine değiştirerek özel anahtar şifreyi doğrulayarak deneyin:

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

Yukarıdaki örnek changeit için şifreden şifreyi değiştirir. Özel anahtar parolası parola ise bu komut başarılı olacaktır.

+1

ben soruya ilişkin olarak bu cevabı kullanmıyordu ise.Bir anahtar deposu dosyası, şifre, diğer ad/anahtar ve anahtar şifresi doğrulamak için yardımcı oldu. – Russ

+0

Lütfen bu komutu yürüttükten sonra anahtar deposu şifresini değiştireceğinizi unutmayın. Şifreyi orijinal olana geri ayarlamanız gerekir. – gersonZaragocin

+0

aslında, sadece '-keypasswd -keystore storefile -alias somealias 'belirtmek için yeterli ve her şeyi bir istekten girin. –

85

Tomcat 6 ve daha önceki bir sürümü kullanıyorsanız, anahtar deposu parolasının ve anahtar parolasının aynı olduğundan emin olun. Tomcat 7 ve daha yenisini kullanıyorsanız, bunların aynı olduğundan emin olun veya anahtar parolası server.xml dosyasında belirtildiğinden emin olun.

+9

Bu doğrudur. Referans https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore – Atharva

+1

İlgili alıntı: Son olarak, bu Sertifika için özel olarak şifre olan * şifre şifresi * istenir (Aynı anahtar deposu dosyasında saklanan diğer Sertifikaların aksine). ** ** Anahtar deposu şifresinin kendisi için kullanıldığı gibi burada aynı şifreyi kullanmalısınız. Bu, Tomcat uygulamasının bir kısıtlamasıdır. (Şu anda, 'keytool' isteminde ENTER tuşuna basmanın otomatik olarak bunu sizin için yapılacağını söyleyecektir.) –

+0

Bu sorunu w vardı JMeter (https) coz Java anahtar deposu ve anahtar şifreleri farklıydı. Ref https://stackoverflow.com/questions/2889238/keystore-change-passwords?noredirect=1&lq=1. sorunu çözmek için anahtar parolayı değiştirmek için. Büyük yardım! Teşekkürler. – Rishi

5

Bir anahtar 64bit OpenSSL Sürüm kullanılarak oluşturulmuş bir anahtar deposuna alınca aynı hatayı aldım. Anahtarı, 32 bitlik OpenSSL sürümü kullanarak oluşturulmuş bir anahtar deposuna almak için aynı prosedürü izlediğimizde her şey yolunda gitti.

+2

Yukarıdaki Hatanın nedeni kötüydü java.security.UnrecoverableKeyException: Cannot anahtarı kurtar. Bunun nedeni yukarıda belirtildiği gibi yanlış bir şifre olabilir, aynı zamanda 64bit OpenSSL Uygulaması ile bir anahtar deposu inşa edilebilir. Bu yüzden Cevabımı başka bir çözüm olarak düşünüyorum. Aynı hata durumunda bana yardımcı oldu, ben de buradaki çözümü sağladım. – Heimi

+0

openssl, Java anahtar deposu dosyaları oluşturmuyor. Bunu açıklayabilir misiniz? –

+0

Size cevap verin. Ben https webservices OpenESB 3.05 formu çağırırken aynı sorunla karşı karşıya. Ben senin yönergeleri izleyin ve bir 32SS OpenSS uygulaması ile yeniden jks dosyası oluşturmak ve iyi çalışıyor –

5

Cannot recover key istisnasının olmaması için, Java Cryptography Extension (JCE) Sınırsız Gücü Yargılama İlkesi Dosyalarını, uygulamamın çalıştırıldığı Java'nın yüklemesine uygulamak zorunda kaldım. Bu dosyaların sürüm 8'i here bulunabilir veya en son sürüm this page'da listelenmelidir. İndirme, politika dosyalarının nasıl uygulanacağını açıklayan bir dosya içerir.


JDK 8u151 yana politika dosyaları eklemek gerekli değildir. Bunun yerine, JCE yetki alanı ilke dosyaları, crypto.policy adı verilen bir Güvenlik özelliği tarafından denetlenir. Bunu, unlimited'a ayarlayarak sınırsız kriptografinin JDK tarafından kullanılmasına izin verin. sürüm notları yukarıda bahsedilen iş şartları ile bağlantılı olarak, bu Security.setProperty() veya java.security dosyası ile ayarlanabilir. java.security dosyası da detaylı here olarak Programı başlatmak için komuta -Djava.security.properties=my_security.properties ekleyerek eklenen edilebilir.


JDK 8u161 yana sınırsız şifreleme varsayılan olarak etkindir.

+0

Bu dosya hatası ilke dosyası kavanozları yüklü olmasına rağmen görüyorum. – Adam

+0

@Adam Çözümüm, yaşadığınız kişiden farklı olan belirli bir durum içindir. Ancak, JDK 8u151'de gerçekleşen değişikliği yansıtacak bir güncelleştirme ekledim. – WhiteKnight