Nedeni: java.security.UnrecoverableKeyException: Anahtar kurtarılamıyor


84

ABCC_client.store adlı bir jks anahtar deposu ile sağlandım. Bu anahtar deposunu cacerts'a aktardığımda ve bağlanmayı denediğimde Böyle bir Algoritma hatası yok diyor. PFA yığın izleme

    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

Ancak bu anahtar deposunu bağımsız olarak kullanırsam, yani onu cacerts'a eklemeden çalışır.

Google'da arama yapmak beni http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ adresine yönlendirdi ve bu şifrenin benim için farklı olabileceğini söylüyor anahtar ve anahtar deposu.


Mümkünse neyin denildiğini görmek için biraz kod mu?
Bruno

kodun içinden bir web hizmeti yöntemini çağırmaya çalışıyordum..AxisFault errorCode: { schemas.xmlsoap.org/soap/envelope } Server.userException errorSubcode: errorString: java.net.SocketException: java.security.NoSuchAlgorithmException: Hata oluşturma uygulama (algoritma: Varsayılan, sağlayıcı: SunJSSE, sınıf: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Bhattacharjee

2
Burada çoğaltılabilir bir soru ile benzer bir soru olabilir.
icrovett

Hayır Benim sorunum, sistem özelliklerini bu anahtar deposunu kullanacak şekilde ayarlarsak anahtar deposu çalışıyor. Ancak bu anahtar deposunu jvm'nin varsayılanına yüklersek, yani cacerts, wrk yapar. Kötü sertifika yazıyor ..
Mrinal Bhattacharjee

Yanıtlar:


109

Tomcat 6 ve önceki bir sürümü kullanıyorsanız, anahtar deposu şifresinin ve anahtar şifresinin aynı olduğundan emin olun. Tomcat 7 ve sonraki bir sürümünü kullanıyorsanız, aynı olduklarından veya anahtar parolasının server.xmldosyada belirtildiğinden emin olun .



2
İlgili alıntı: Son olarak, sizden bu Sertifika için özel olarak şifre olan anahtar şifresini girmeniz istenecektir (aynı anahtar deposu dosyasında saklanan diğer Sertifikaların aksine). Sen GEREKİR deposu parolası kendisi için kullanıldığı gibi burada aynı şifreyi kullanmayın. Bu, Tomcat uygulamasının bir kısıtlamasıdır. (Şu anda, keytoolkomut istemi size ENTER tuşuna basmanın bunu sizin için otomatik olarak yaptığını söyleyecektir.)
Captain Man

Bu sorunu JMeter (https) coz Java anahtar deposu ile yaşadım ve anahtar parolaları farklıydı. Ref stackoverflow.com/questions/2889238/… . sorunu çözmek için anahtar şifresini değiştirmek için. Harika yardım! Teşekkürler.
Rishi

@CaptainMan bu yalnızca Tomcat6'da doğru, Tomcat7'den değil .
Andrea Ligios

2
@AndreaLigios iyi bir nokta, konuyla ilgili alıntı: Son olarak, sizden özellikle bu Sertifikanın şifresi olan anahtar şifresini girmeniz istenecektir (aynı anahtar deposu dosyasında saklanan diğer Sertifikaların aksine). keytoolİstemi ENTER tuşuna basılması ile otomatik keystore'da olarak anahtar için aynı şifreyi kullandığını söyleyecektir. Aynı şifreyi kullanmakta veya özel bir şifre seçmekte özgürsünüz. Anahtar deposu şifresinden farklı bir şifre seçerseniz, server.xmlyapılandırma dosyasında özel şifreyi de belirtmeniz gerekecektir .
Kaptan Adam

73

Uygulamanızda / yapılandırmanızda tanımlanan özel anahtar parolası yanlış. Önce aşağıdaki gibi başka bir şifreyle değiştirerek özel anahtar şifresini doğrulamayı deneyin:

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

Yukarıdaki örnek, parolayı değiştirmek için parolayı değiştirir. Özel anahtar şifresi şifre ise bu komut başarılı olacaktır.


2
Bu cevabı soruyla ilgili olarak kullanmadım. Bir anahtar deposu dosyasını, mağaza şifresini, diğer adı / anahtarı ve anahtar şifresini doğrulamak için yararlıydı.
Russ

1
Lütfen bu komutu çalıştırdıktan sonra anahtar deposu şifresini değiştireceğinizi unutmayın. Şifreyi orijinal şifreye geri ayarlamanız gerekir.
gersonZaragocin

aslında, sadece belirtmek -keypasswd -keystore storefile -alias somealiasve diğer her şeyi bir komut istemine girmek yeterlidir .
Andrey Regentov

Bu kodu çalıştırırken şu hatayı alıyorum - "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"Takma ad anahtar parolamın ne olduğunu kontrol etmenin veya eskisini bilmeden değiştirmenin bir yolu var mı?
Kavin Raju S

10

İstisnaya sahip olmamak için, Cannot recover keyJava Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files'ı uygulamamı çalıştıran Java kurulumuna uygulamalıydım. Bu dosyaların 8. sürümü burada bulunabilir veya en son sürüm bu sayfada listelenmelidir . İndirme, ilke dosyalarının nasıl uygulanacağını açıklayan bir dosya içerir.


JDK 8u151'den beri ilke dosyalarının eklenmesine gerek yoktur. Bunun yerine, JCE yetki alanı ilke dosyaları adlı bir Güvenlik özelliği tarafından kontrol edilir crypto.policy. unlimitedSınırsız kriptografinin JDK tarafından kullanılmasına izin verecek şekilde ayarlanması . Yukarıdaki duruma bağlı sürüm notları gibi Security.setProperty(), java.securitydosya tarafından veya dosya aracılığıyla ayarlanabilir . java.securityDosyası da ekleyerek eklenmiş olabilir -Djava.security.properties=my_security.propertiesayrıntılı olarak Programı başlatmak için komuta burada .


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


3
İlke dosyası kavanozlarının kurulu olmasına rağmen bu hatayı görüyorum.
Adam

@Adam Benim çözümüm, yaşadığınız durumdan farklı olabilecek belirli bir durum içindir. Ancak, JDK 8u151'de meydana gelen değişikliği yansıtacak bir güncelleme ekledim.
WhiteKnight

5

64bit OpenSSL Sürümü kullanılarak oluşturulmuş bir anahtar deposuna bir anahtarı içe aktardığımızda da aynı hatayı aldım. Anahtarı 32 bit OpenSSL sürümü kullanılarak oluşturulmuş bir anahtar deposuna aktarmak için aynı prosedürü izlediğimizde her şey yolunda gitti.


3
Yukarıdaki Hatanın temel nedeni java.security.UnrecoverableKeyException idi: Anahtar kurtarılamıyor. Bunun nedeni, yukarıda belirtildiği gibi yanlış bir parola olabilir, aynı zamanda 64 bit OpenSSL Uygulaması ile bir anahtar deposu derlemesi olabilir. Bu yüzden Cevabımı başka bir olası çözüm olarak görüyorum. Aynı hata durumunda bana yardımcı oldu, bu yüzden çözümü burada sağladım.
Heimi

openssl, Java anahtar deposu dosyaları oluşturmaz. Bunu açıklar mısın?
aled

Teşekkürler cevap ver. OpenESB 3.05'ten https web servislerini çağırırken de aynı problemle karşılaşıyorum. Talimatlarınızı takip ediyorum ve jks dosyasını 32bit OpenSS uygulamasıyla tekrar oluşturuyorum ve sorunsuz çalışıyor
Marti Pàmies Solà

2

Aşağıdaki komutu çalıştırarak kullandığınız şifrenin doğru olup olmadığını kontrol edin

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit

Aşağıdaki hatayı alıyorsanız, şifreniz yanlıştır

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.