Como resolver: jno_key_entry

Sep 02 2020

Eu tenho os seguintes arquivos que foram gerados pelo Sectigo:

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

Estou usando Zulu JDK 11.0.8 e SpringBoot 2.2.0 no Windows. O que estou tentando fazer é habilitar https no aplicativo SpringBoot.

Estas são as propriedades ssl no arquivo de propriedades SpringBoot:

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

Eu gerei um keystore usando o seguinte comando:

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

Ao executar o aplicativo, recebo a seguinte mensagem de erro:

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

Alguma ideia do que fiz de errado?

Obrigado

Respostas

1 dave_thompson_085 Sep 02 2020 at 08:00

TLDR: você precisa da chave privada

Embora muitas vezes falemos vagamente sobre um servidor SSL / TLS ter ou usar 'um certificado', na verdade ele não precisa apenas de um certificado, mas da chave privada associada (sempre) e de qualquer certificado CA intermediário também conhecido como 'cadeia' (geralmente , mas pode depender da CA e / ou clientes). keytool -importé um alias para o -importcertqual importa apenas um certificado ou cadeia; isso adiciona um certificado / cadeia a um privateKeyEntry preexistente ou cria um trustedCertEntry. No seu caso, seu armazenamento de chaves ainda não continha a chave privada, então o keytool criou um trustedCertEntry, que é o motivo pelo qual Tomcat reclama que o alias configurado é 'no_key_entry' - ou seja, é um trustedCertEntry, que é inadequado, inutilizável e errado, não um privateKeyEntry conforme necessário e obrigatório.

Pesquise por 'converter PEM em Java keystore' ou 'converter PEM em JKS' (e possivelmente 'converter PEM em PKCS12' também) e você encontrará centenas de perguntas feitas na última década, com tantas variações das duas respostas reais :

  1. Se você tiver ou obter OpenSSL, use openssl pkcs12 -exportpara combinar o certificado, a chave privada e os arquivos de formato PEM de cadeia (CA) em um arquivo de formato PKCS12. Java moderno (desde 2017) sempre pode usar PKCS12 diretamente como um armazenamento de chaves; versões mais antigas às vezes podiam fazer isso, mas às vezes exigiam que você convertesse o PKCS12 em JKS com keytool -importkeystore(não -import[cert]) e as respostas mais antigas refletem esse requisito anterior. Se necessário, você pode mover ou copiar os arquivos no formato PEM para outra máquina que seja suficientemente segura e tenha OpenSSL e, em seguida, mover ou copiar o PKCS12 de volta.

    O OpenSSL é padrão em quase todos os Linux e muitos outros Unixes, mas não no Windows. Você pode obtê-lo para Windows em várias fontes, as quais considerohttp://slproweb.com/products/Win32OpenSSL.html o mais bem conservado.

  2. Baixe e use o KeyStore Explorer .