Causato da: java.security.UnrecoverableKeyException: Impossibile recuperare la chiave


84

Mi viene fornito un keystore jks denominato ABCC_client.store. Quando importa questo keystore in cacerts e provo a connetterlo, viene visualizzato il messaggio Nessun errore di algoritmo. PFA lo stacktrace

    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

Ma se uso questo keystore in modo indipendente, cioè senza aggiungerlo a cacerts, funziona.

Alcuni googling mi hanno portato a http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/ che dice che la password potrebbe essere diversa per la chiave e il keystore.


Un po 'di codice per vedere come viene chiamato, se possibile?
Bruno

stavo cercando di chiamare un metodo di servizio web dall'interno del codice..AxisFault faultCode: { schemas.xmlsoap.org/soap/envelope } Server.userException faultSubcode: faultString: java.net.SocketException: java.security.NoSuchAlgorithmException: errore di costruzione implementazione (algoritmo: predefinito, provider: SunJSSE, classe: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Bhattacharjee

2
Può essere duplicato qui è una domanda simile con una risposta .
icrovett

No Il mio problema è che il keystore funziona se impostiamo le proprietà di sistema per utilizzare quel keystore. Ma se carichiamo quel keystore nel default di jvm, cioè cacerts, fa wrk. Dice un cattivo certificato ..
Mrinal Bhattacharjee

Risposte:


109

Se si utilizza Tomcat 6 e versioni precedenti, assicurarsi che la password del keystore e la password della chiave siano le stesse. Se utilizzi Tomcat 7 e versioni successive, assicurati che siano uguali o che la password della chiave sia specificata nel server.xmlfile.


10
Questo è vero. Riferimento tomcat.apache.org/tomcat-6.0-doc/…
Atharva

2
Citazione pertinente: infine, ti verrà richiesta la password della chiave , che è la password specifica per questo certificato (a differenza di qualsiasi altro certificato memorizzato nello stesso file di archivio chiavi). È NECESSARIO utilizzare qui la stessa password utilizzata per la password del keystore stesso. Questa è una restrizione dell'implementazione di Tomcat. (Attualmente, il keytoolprompt ti dirà che premendo il tasto INVIO lo fai automaticamente.)
Captain Man

Ho avuto questo problema con JMeter (https) perché il keystore Java e le password delle chiavi erano diverse. Rif . Stackoverflow.com/questions/2889238/… . per modificare la password della chiave per risolvere il problema. Grande aiuto! Grazie.
Rishi

@CaptainMan è vero solo in Tomcat6, da Tomcat7 non lo è .
Andrea Ligios

2
@AndreaLigios buon punto, citazione pertinente: infine, ti verrà richiesta la password della chiave , che è la password specifica per questo certificato (al contrario di qualsiasi altro certificato memorizzato nello stesso file di archivio chiavi). Il keytoolprompt dirà che premendo il tasto INVIO si utilizza automaticamente la stessa password per la chiave del keystore. Sei libero di utilizzare la stessa password o di selezionarne una personalizzata. Se si seleziona una password diversa dalla password del keystore, sarà inoltre necessario specificare la password personalizzata nel server.xmlfile di configurazione.
Captain Man

73

La password della chiave privata definita nella tua app / configurazione non è corretta. Per prima cosa prova a verificare la password della chiave privata cambiandola con un'altra come segue:

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

L'esempio sopra cambia la password da password a changeit. Questo comando avrà esito positivo se la password della chiave privata era password.


2
Anche se non ho usato questa risposta in relazione alla domanda. È stato utile per convalidare un file di archivio chiavi, memorizzare password, alias / chiave e password chiave.
Russ

1
Ricorda che dopo aver eseguito questo comando cambierai la password del keystore. Dovresti reimpostare la password su quella originale.
gersonZaragocin

in realtà, è sufficiente specificare solo -keypasswd -keystore storefile -alias somealiase inserire tutto il resto in un prompt.
Andrey Regentov

Eseguendo questo codice ricevo il seguente errore: "keytool error: java.security.UnrecoverableKeyException: Cannot recover key"c'è un modo per controllare qual è la password della mia chiave alias o cambiarla senza conoscere quella vecchia?
Kavin Raju S

10

Per non avere l' Cannot recover keyeccezione, ho dovuto applicare i file di criteri di giurisdizione di forza illimitata di Java Cryptography Extension (JCE) all'installazione di Java su cui era in esecuzione la mia applicazione. La versione 8 di questi file può essere trovata qui o l'ultima versione dovrebbe essere elencata in questa pagina . Il download include un file che spiega come applicare i file dei criteri.


Poiché JDK 8u151 non è necessario aggiungere file di criteri. I file dei criteri di giurisdizione JCE sono invece controllati da una proprietà Security chiamata crypto.policy. Impostandolo su unlimitedcon consenti l'utilizzo della crittografia illimitata da parte di JDK. Poiché le note di rilascio collegate allo stato precedente, possono essere impostate da Security.setProperty()o tramite il java.securityfile. Il java.securityfile potrebbe anche essere aggiunto aggiungendo -Djava.security.properties=my_security.propertiesal comando per avviare il programma come descritto qui .


Poiché la crittografia illimitata JDK 8u161 è abilitata per impostazione predefinita.


3
Vedo questo errore nonostante siano installati i jar del file dei criteri.
Adam,

@Adam La mia soluzione è per un caso specifico, che potrebbe essere diverso da quello che stai vivendo. Tuttavia ho aggiunto un aggiornamento per riflettere la modifica avvenuta in JDK 8u151.
WhiteKnight

5

Ho avuto lo stesso errore quando abbiamo importato una chiave in un keystore che era stato creato utilizzando una versione OpenSSL a 64 bit. Quando abbiamo seguito la stessa procedura per importare la chiave in un keystore creato utilizzando una versione OpenSSL a 32 bit, è andato tutto bene.


3
La causa principale dell'errore precedente era java.security.UnrecoverableKeyException: Impossibile recuperare la chiave. La ragione di ciò può essere una falsa password come menzionato sopra, ma anche una build di keystore con un'implementazione OpenSSL a 64 bit. Quindi considero la mia risposta come un'altra possibile soluzione. Mi ha aiutato nella stessa situazione di errore, quindi ho fornito la soluzione qui.
Heimi

openssl non crea file di archivio chiavi Java. Puoi chiarire questo?
aled

Grazie per la tua risposta. Devo affrontare lo stesso problema quando richiamo i servizi web https da OpenESB 3.05. Seguo le tue istruzioni e genero di nuovo il file jks con un'implementazione a 32 bit di OpenSS e funziona bene
Marti Pàmies Solà

2

Verifica se la password che stai utilizzando è quella corretta eseguendo il comando seguente

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

Se ricevi l'errore di seguito, la tua password è sbagliata

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.