java - 如何解决 : jno_key_entry

标签 java spring-boot ssl keytool

我有以下由 Sectigo 生成的文件:

  • XXX1.pem
  • XXX1.key
  • XXX1.csr
  • XXX1.crt
  • 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
    
    我使用以下命令生成了一个 keystore :
    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。在您的情况下,您的 keystore 尚未包含私钥,因此 keytool 创建了一个trustedCertEntry,这就是Tomcat 提示配置的别名为“no_key_entry”的原因——即它是一个trustedCertEntry,它不充分、不可用和错误,而不是privateKeyEntry 是需要和必需的。
    搜索“将 PEM 转换为 Java keystore ”或“将 PEM 转换为 JKS”(还可能还有“将 PEM 转换为 PKCS12”),您会发现在过去十年中提出的数百个问题,其中两个真实答案的变体差不多:

  • 如果您拥有或获得 OpenSSL,请使用 openssl pkcs12 -export将证书、私钥和链 (CA) PEM 格式文件组合成 PKCS12 格式文件。现代 Java(自 2017 年以来)始终可以直接使用 PKCS12 作为 keystore ;旧版本有时可以做到这一点,但有时需要您使用 keytool -importkeystore 将 PKCS12 转换为 JKS (不是 -import[cert] )和较早的答案反射(reflect)了以前的要求。如有必要,您可以将 PEM 格式文件移动或复制到另一台足够安全且具有 OpenSSL 的计算机上,然后将 PKCS12 移动或复制回去。
    OpenSSL 是几乎所有 Linux 和许多其他 Unix 的标准,但 Windows 不是。你可以从我认为的几个来源获得它用于 Windows http://slproweb.com/products/Win32OpenSSL.html维护得最好的。
  • 下载使用KeyStore Explorer .
  • 关于java - 如何解决 : jno_key_entry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63695175/

    相关文章:

    java - 引用 Java 中的集合类型函数

    java - "Not a managed type..."启动 Spring Boot 应用程序时出错。我究竟做错了什么?

    reactjs - React App + Spring Boot - Chrome 中未设置 cookie 内的 JWT 身份验证 token

    .net - 站点使用 SSL,但是 JSON 查询呢?

    ssl - Xamarin - Android - 手动验证服务器的 SSL 证书 ModernHttpClient

    java - 从分支内部调用错误的 <init> 方法

    java - 尝试 FilteredTree 时出现 AssertionFailedException

    java - 如何以编程方式将 Facet 添加到 Oracle ADF 中的 PanelBox

    spring - org.springframework.boot.autoconfigure.batch.BatchConfigurerConfiguration$JdbcBatchConfiguration 中方法batchConfigurer的参数1 必需

    apache - Shibboleth 忽略配置设置