Come risolvere: jno_key_entry

Sep 02 2020

Ho i seguenti file generati da Sectigo:

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

Sto usando Zulu JDK 11.0.8 e SpringBoot 2.2.0 su Windows. Quello che sto cercando di fare è abilitare https nell'app SpringBoot.

Queste sono le proprietà ssl nel file delle proprietà SpringBoot:

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

Ho generato un keystore utilizzando il seguente comando:

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

Quando eseguo l'app ricevo il seguente messaggio di errore:

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

Qualche idea su cosa ho sbagliato?

Grazie

Risposte

1 dave_thompson_085 Sep 02 2020 at 08:00

TLDR: è necessaria la chiave privata

Sebbene si parli spesso in modo approssimativo di un server SSL / TLS che ha o utilizza 'un certificato', in realtà non necessita solo di un certificato ma della chiave privata associata (sempre) e di qualsiasi certificato CA intermedio, noto anche come catena, (di solito , ma può dipendere dalla CA e / o dai client). keytool -importè un alias per il -importcertquale importa solo un certificato o una catena; questo aggiunge un cert / chain a un privateKeyEntry preesistente o crea un trustedCertEntry. Nel tuo caso il tuo keystore non conteneva già la privatekey, quindi keytool ha creato un trustedCertEntry, motivo per cui Tomcat si lamenta che l'alias configurato è 'no_key_entry' - cioè è un trustedCertEntry, che è inadeguato, inutilizzabile e sbagliato, non un privateKeyEntry come è necessario e richiesto.

Cerca "converti PEM in archivio chiavi Java" o "converti PEM in JKS" (e possibilmente anche "converti PEM in PKCS12") e troverai centinaia di domande poste negli ultimi dieci anni, con circa altrettante variazioni delle due risposte reali :

  1. Se si dispone o si ottiene OpenSSL, utilizzare openssl pkcs12 -exportper combinare i file in formato PEM del certificato, della chiave privata e della catena (CA) in un file in formato PKCS12. Modern Java (dal 2017) può sempre utilizzare PKCS12 direttamente come keystore; le versioni precedenti a volte potevano farlo, ma a volte richiedevano di convertire il PKCS12 in JKS con keytool -importkeystore(non -import[cert]) e le risposte precedenti riflettono quel requisito precedente. Se necessario, è possibile spostare o copiare i file in formato PEM su un'altra macchina sufficientemente sicura e dotata di OpenSSL, quindi spostare o copiare nuovamente il PKCS12.

    OpenSSL è standard su quasi tutti i Linux e molti altri Unix, ma non su Windows. Puoi ottenerlo per Windows da diverse fonti di cui considerohttp://slproweb.com/products/Win32OpenSSL.html il meglio mantenuto.

  2. Scarica e utilizza KeyStore Explorer .