2013-04-12 27 views
61

Sono fornito con un archivio di chiavi jks denominato ABCC_client.store. Quando importare questo keystore in cacerts e provare a connetterlo, si dice No error Algorithm. PFA StackTraceCausato da: java.security.UnrecoverableKeyException: Impossibile recuperare la chiave

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 io uso questo archivio chiavi indipendentemente cioè senza inserirlo nella 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.

+0

Un po 'di codice per vedere cosa viene chiamato se possibile? – Bruno

+0

stavo provando a chiamare un metodo di servizio web dal codice..AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.net.SocketException : java.security.NoSuchAlgorithmException: Errore nella costruzione dell'implementazione (algoritmo: predefinito, provider: SunJSSE, classe: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) –

+2

Può essere duplicato qui è una domanda [simile] (http://stackoverflow.com/questions/1321557/can-not-get-key-from-keystore) con un asnwer. – icrovett

risposta

57

La password della chiave privata definita nell'app/config è errata. Prima prova verificando la la password della chiave privata passando ad un altro come segue:

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

L'esempio precedente modifica la password da password per changeit. Questo comando avrà esito positivo se la password della chiave privata era password.

+1

Mentre non ho usato questa risposta in relazione alla domanda.È stato utile per convalidare un file di archivio di chiavi, la password di archiviazione, l'alias/chiave e la password della chiave. – Russ

+0

Ricordare che dopo aver eseguito questo comando si cambierà la password del keystore. Dovresti reimpostare la password su quella originale. – gersonZaragocin

+0

, in realtà, è sufficiente specificare solo '-keypasswd -keystore storefile -alias somealias' e inserire tutto il resto in un prompt. –

85

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

+9

Questo è vero. Riferimento https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore – Atharva

+1

Preventivo pertinente: Infine, verrà richiesta la * password chiave *, che è la password specifica per questo certificato (al contrario di qualsiasi altro certificato memorizzato nello stesso file keystore). È ** DEVE ** utilizzare la stessa password qui utilizzata per la password del keystore stesso. Questa è una restrizione dell'implementazione di Tomcat. (Al momento, il prompt 'keytool' ti dirà che premere il tasto INVIO lo fa automaticamente.) –

+0

Ho avuto questo problema w JMeter (https) coz keystore Java e le password delle chiavi erano diverse. Ref https://stackoverflow.com/questions/2889238/keystore-change-passwords?noredirect=1&lq=1. cambiare la password della chiave per risolvere il problema. Grande aiuto! Grazie. – Rishi

5

Ho avuto lo stesso errore quando abbiamo importato una chiave in un keystore 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, tutto è andato per il verso giusto.

+2

La causa principale dell'errore sopra era java.security.UnrecoverableKeyException: Can not recuperare la chiave. La ragione di ciò può essere una password falsa come menzionato sopra, ma anche una build del 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

+0

openssl non crea file keystore Java. Potresti chiarire questo? –

+0

Thks for you answer. Affronto lo stesso problema quando invoco https webservices form OpenESB 3.05. Seguo le tue istruzioni e generi di nuovo il file jks con un'implementazione a 32 bit di OpenSS e funziona perfettamente –

5

Per non avere l'eccezione Cannot recover key, ho dovuto applicare i file dei criteri di giurisdizione 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 here o l'ultima versione dovrebbe essere elencata su this page. Il download include un file che spiega come applicare i file di criteri.


Dal JDK 8u151 non è necessario aggiungere i file di criteri. Invece i file delle politiche di giurisdizione JCE sono controllati da una proprietà di sicurezza denominata crypto.policy. Impostandolo su unlimited con consentire la crittografia illimitata da utilizzare da JDK. Come note di rilascio collegate allo stato precedente, può essere impostato da Security.setProperty() o tramite il file java.security. È inoltre possibile aggiungere il file java.security aggiungendo -Djava.security.properties=my_security.properties al comando per avviare il programma come dettagliato here.


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

+0

Sto vedendo questo errore nonostante abbia installato i file dei criteri. – Adam

+0

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