如何解决:jno_key_entry

问题描述

我有一个由Sectigo生成的以下文件

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

我在Windows上使用Zulu JDK 11.0.8和SpringBoot 2.2.0。我想做的是在SpringBoot应用程序中启用https。

这是SpringBoot属性文件中的ssl属性

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

知道我做错了什么吗?

谢谢

解决方法

TLDR:您需要私钥

尽管我们经常松散地讨论具有或使用“证书”的SSL / TLS服务器,但实际上它不仅需要证书,而且还需要关联的私钥(始终)以及任何关联的中间“链” CA证书。 )(通常,但可能取决于CA和/或客户端)。 keytool -import-importcert的别名,它仅导入证书或链;这可以将证书/链添加到预先存在的 privateKeyEntry中,或创建一个TrustedCertEntry。在您的情况下,您的密钥库尚未包含私钥,因此keytool创建了TrustedCertEntry,这就是Tomcat抱怨配置的别名为'no_key_entry'的原因-即它是TrustedCertEntry,它是不足,无法使用和错误的,不是privateKeyEntry(根据需要和要求)。

搜索“将PEM转换为Java密钥库”或“将PEM转换为JKS”(也可能将“将PEM转换为PKCS12”),您会发现在过去十年中有数百个问题,其中包括两个真实答案:

  1. 如果拥有或获得OpenSSL,请使用openssl pkcs12 -export将证书,私钥和链(CA)PEM格式的文​​件合并为PKCS12格式的文件。现代Java(自2017年起)始终可以直接将PKCS12用作密钥库;较早的版本有时可以执行此操作,但有时需要您使用keytool -importkeystore(而不是-import[cert])将PKCS12转换为JKS,而较早的答案则反映了以前的要求。如有必要,您可以将PEM格式的文​​件移动或复制到足够安全并具有OpenSSL的另一台计算机上,然后再将PKCS12移动或复制。

    OpenSSL在几乎所有Linux和许多其他Unix(而非Windows)上都是标准配置。您可以从Windows {@ 3}认为维护得最好的几个来源中获得Windows版。

  2. 下载并使用http://slproweb.com/products/Win32OpenSSL.html