Causado por: java.security.UnrecoverableKeyException: no se puede recuperar la clave

Se me proporciona un almacén de claves jks llamado ABCC_client.store. Cuando importo este almacén de claves para cacerts e bash conectarlo, dice No such Algorithm error. PFA the 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 

Pero si uso este keystore de forma independiente, es decir, sin agregarlo a cacerts, funciona.

Un poco de google me llevó a http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/, que dice que esa contraseña podría ser diferente para mí la llave y el almacén de llaves

Si usa Tomcat 6 y versiones anteriores, asegúrese de que la contraseña del almacén de claves y la contraseña de la clave sean las mismas. Si usa Tomcat 7 y posterior, asegúrese de que sean iguales o que la contraseña de la clave esté especificada en el archivo server.xml .

La contraseña de clave privada definida en su aplicación / configuración es incorrecta. Primero intente verificar la contraseña de la clave privada cambiando a otra de la siguiente manera:

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

El ejemplo anterior cambia la contraseña de contraseña para cambiarla. Este comando tendrá éxito si la contraseña de la clave privada fue contraseña.

Para no tener la excepción Cannot recover key , tuve que aplicar los archivos de la Política de Jurisdicción de Fuerza Ilimitada de la Extensión de Criptografía Java (JCE) a la instalación de Java que estaba ejecutando mi aplicación. La versión 8 de esos archivos se puede encontrar aquí o la última versión debe aparecer en esta página . La descarga incluye un archivo que explica cómo aplicar los archivos de política.


Desde JDK 8u151 no es necesario agregar archivos de política. En cambio, los archivos de políticas de jurisdicción de JCE están controlados por una propiedad de seguridad llamada crypto.policy . Al establecer eso en unlimited permita que el JDK use criptografía ilimitada. Como las notas de la versión vinculadas al estado anterior, se pueden establecer mediante Security.setProperty() o mediante el archivo java.security . El archivo java.security también se puede agregar agregando -Djava.security.properties=my_security.properties al comando para iniciar el progtwig como se detalla aquí .


Como la criptografía JDK 8u161 ilimitada está habilitada de manera predeterminada.

Tuve el mismo error cuando importamos una clave en un almacén de claves que se compiló usando una versión OpenSSL de 64 bits. Cuando seguimos el mismo procedimiento para importar la clave en un almacén de claves que se compiló usando una versión OpenSSL de 32 bits, todo salió bien.