Как решить: jno_key_entry

Sep 02 2020

У меня есть следующие файлы, созданные Sectigo:

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

Я использую Zulu JDK 11.0.8 и SpringBoot 2.2.0 для Windows. Я пытаюсь включить https в приложении SpringBoot.

Это свойства ssl в файле свойств SpringBoot:

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

Я создал хранилище ключей, используя следующую команду:

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

При запуске приложения я получаю следующее сообщение об ошибке:

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

Есть идеи, что я сделал не так?

Спасибо

Ответы

1 dave_thompson_085 Sep 02 2020 at 08:00

TL; DR: вам нужен приватный ключ

Хотя мы часто вольно говорим о сервере SSL / TLS, имеющем или использующем «сертификат», на самом деле ему нужен не только сертификат, но и связанный с ним закрытый ключ (всегда) и любые связанные промежуточные сертификаты ЦС «цепочки» (обычно , но может зависеть от ЦС и / или клиентов). keytool -importпсевдоним, для -importcertкоторого импортируется только сертификат или цепочка; это либо добавляет сертификат / цепочку к уже существующему privateKeyEntry, либо создает trustCertEntry. В вашем случае ваше хранилище ключей еще не содержало закрытый ключ, поэтому keytool создал доверенныйCertEntry, поэтому Tomcat жалуется, что настроенный псевдоним - no_key_entry, т.е. privateKeyEntry по мере необходимости.

Выполните поиск по запросу «преобразовать PEM в хранилище ключей Java» или «преобразовать PEM в JKS» (и, возможно, также «преобразовать PEM в PKCS12»), и вы найдете сотни вопросов, заданных за последнее десятилетие, с примерно таким же количеством вариантов двух реальных ответов. :

  1. Если у вас есть или вы получаете OpenSSL, используйте openssl pkcs12 -exportдля объединения файлов PEM-формата сертификата, закрытого ключа и цепочки (CA) в файл формата PKCS12. Современная Java (с 2017 г.) всегда может использовать PKCS12 напрямую в качестве хранилища ключей; старые версии иногда могли это сделать, но иногда требовали, чтобы вы преобразовали PKCS12 в JKS с keytool -importkeystore(не -import[cert]), а старые ответы отражают это прежнее требование. При необходимости вы можете переместить или скопировать файлы в формате PEM на другой компьютер, который достаточно безопасен и имеет OpenSSL, а затем переместить или скопировать PKCS12 обратно.

    OpenSSL входит в стандартную комплектацию почти всех Linux и многих других Unix, но не Windows. Вы можете получить его для Windows из нескольких источников, которые я считаюhttp://slproweb.com/products/Win32OpenSSL.html самый ухоженный.

  2. Загрузите и используйте KeyStore Explorer .