如何解决:jno_key_entry

How to resolve : 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 服务器拥有或使用 'a certificate',但实际上它不仅需要证书,还需要相关的私钥(总是)和任何相关的中间体 'chain' CA 证书(通常,但可能取决于 CA and/or 客户端)。 keytool -import-importcert 的别名,只导入证书或链;这要么将 cert/chain 添加到 预先存在的 privateKeyEntry,要么创建一个 trustedCertEntry。在你的情况下,你的密钥库还没有包含私钥,所以 keytool 创建了一个 trustedCertEntry,这就是为什么 Tomcat 抱怨配置的别名是 'no_key_entry' —— 即它是一个 trustedCertEntry,它不合适,不可用,错误,不是需要和要求的 privateKeyEntry。

搜索 'convert PEM to Java keystore' 或 'convert PEM to JKS'(可能还有 'convert PEM to PKCS12'),您会发现过去十年中提出的数百个问题,其中两个真实的变体差不多答案:

  1. 如果您拥有或获得 OpenSSL,请使用 openssl pkcs12 -export 将证书、私钥和链 (CA) PEM-format 文件组合成 PKCS12 格式的文件。 Modern Java(自 2017 年起)始终可以直接使用 PKCS12 作为密钥库;旧版本有时可以做到这一点,但有时需要您使用 keytool -importkeystore(而不是 -import[cert])将 PKCS12 转换为 JKS,而旧版本的答案反映了以前的要求。如有必要,您可以将 PEM-format 文件移动或复制到另一台足够安全且具有 OpenSSL 的计算机,然后将 PKCS12 移动或复制回来。

    OpenSSL 是几乎所有 Linux 和许多其他 Unix 的标准配置,但不是 Windows。您可以从多个来源以 Windows 的价格获得它,我认为 http://slproweb.com/products/Win32OpenSSL.html 和 best-maintained。

  2. 下载并使用KeyStore Explorer