Cómo resolver: jno_key_entry

Sep 02 2020

Tengo los siguientes archivos que fueron generados por Sectigo:

  1. XXX1.pem
  2. XXX1.key
  3. XXX1.csr
  4. XXX1.crt
  5. XXX1.ca

Estoy usando Zulu JDK 11.0.8 y SpringBoot 2.2.0 en Windows. Lo que estoy tratando de hacer es habilitar https en la aplicación SpringBoot.

Estas son las propiedades ssl en el archivo de propiedades SpringBoot:

server.ssl.key-store-type=JKS
server.ssl.key-store=XX1.jks
server.ssl.key-store-password=password
server.ssl.key-alias=tomcat

Genere un almacén de claves usando el siguiente comando:

keytool -import -alias tomcat -file XXX1.crt -keystore XX1.jks -storepass password

Al ejecutar la aplicación, aparece el siguiente mensaje de error:

Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 17 common frames omitted
Caused by: java.lang.IllegalArgumentException: jsse.alias_no_key_entry
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:586) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 19 common frames omitted
Caused by: java.io.IOException: jsse.alias_no_key_entry
    at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:328) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 25 common frames omitted

¿Alguna idea de lo que hice mal?

Gracias

Respuestas

1 dave_thompson_085 Sep 02 2020 at 08:00

TLDR: necesitas la clave privada

Aunque a menudo hablamos vagamente de que un servidor SSL / TLS tiene o usa 'un certificado', de hecho no solo necesita un certificado, sino la clave privada asociada (siempre) y cualquier certificado de CA intermedio asociado también conocido como 'cadena' (generalmente , pero puede depender de la CA y / o los clientes). keytool -importes un alias para el -importcertque importa solo un certificado o una cadena; esto agrega un certificado / cadena a un privateKeyEntry preexistente , o crea un trustCertEntry. En su caso, su almacén de claves aún no contenía la clave privada, por lo que keytool creó una TrustedCertEntry, por lo que Tomcat se queja de que el alias configurado es 'no_key_entry', es decir, es una FiableCertEntry, que es inadecuada, inutilizable y incorrecta, no una privateKeyEntry según sea necesario y obligatorio.

Busque 'convertir PEM a Java keystore' o 'convertir PEM a JKS' (y posiblemente 'convertir PEM a PKCS12' también) y encontrará cientos de preguntas formuladas durante la última década, con casi la misma cantidad de variaciones de las dos respuestas reales :

  1. Si tiene u obtiene OpenSSL, utilice openssl pkcs12 -exportpara combinar los archivos de formato PEM de certificado, clave privada y cadena (CA) en un archivo de formato PKCS12. Java moderno (desde 2017) siempre puede usar PKCS12 directamente como almacén de claves; Las versiones anteriores a veces podían hacer esto, pero a veces requerían que convirtiera el PKCS12 a JKS con keytool -importkeystore(no -import[cert]) y las Respuestas anteriores reflejan ese requisito anterior. Si es necesario, puede mover o copiar los archivos en formato PEM a otra máquina que sea suficientemente segura y tenga OpenSSL y luego mover o copiar el PKCS12 nuevamente.

    OpenSSL viene de serie en casi todos los Linux y muchos otros Unix, pero no en Windows. Puede obtenerlo para Windows de varias fuentes de las que considerohttp://slproweb.com/products/Win32OpenSSL.html el mejor mantenido.

  2. Descargue y use KeyStore Explorer .