Error 'Cannot recover key' al configurar un conector SSL en Tomcat

Al configurar el conector Tomcat de Jira para que cifre las comunicaciones, tras reiniciar el servicio, Tomcat dió el siguiente error java.io.IOException: Cannot recover key y el conector no iniciaba.

A continuación el log del Tomcat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
20-Feb-2017 08:56:48.994 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-bio-8443"]
java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 14 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more
20-Feb-2017 08:56:48.997 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
... 19 more
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)
... 13 more
Caused by: java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 19 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more

Un error de tipo java.io.IOException: Cannot recover key es indicativo de que la contraseña de acceso al certificado albergado en la keystore es distinta a las contraseña de la propia keystore, por lo que Tomcat no puede acceder a dicho certificado.

Solución

Simplemente es necesario cambiar la contraseña del certificado para hacer que coincida con la contraseña de la keystore, esto se puede hacer con keytool:
keytool -keypasswd -alias nombre-actual -new KeystorePassword -keystore /path/keystore

  • -keypasswd, es el comando que permite el cambio de contraseña.
  • -alias, indica el nombre del certificado sobre el cual se va ha ejecutar el comando.
  • -new, indica la nueva contraseña de acceso al certificado.
  • -keystore, indica la keystore.

A continuación un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@JIRA:/# keytool -list -keystore /opt/atlassian/jira/conf/.keystore
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
jira.my-company.com, 20-Feb-2017, PrivateKeyEntry,
Certificate fingerprint (SHA1): 35:DD:A3:8D:BD:B7:75:EF:35:80:E5:A3:49:51:A7:C9:8F:5C:0A:D0
root@JIRA:/# keytool -keypasswd -alias jira.my-company.com -new KeystorePassword -keystore /opt/atlassian/jira/conf/.keystore
Enter keystore password:
Enter key password for <jira.my-company.com>

Entradas de interés

Contenidos
  1. 1. Solución