machine cacerts java ssl ssl-certificate jks

java - cacerts - keystore vs truststore



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

Se me proporciona un almacén de claves jks llamado ABCC_client.store. Cuando importo este almacén de claves para cacerts e intento 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


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 here 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 programa como se detalla here .

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


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 .


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.