【问题标题】:Tomcat in Eclipse giving java.security.UnrecoverableKeyException- Cannot recover key errorEclipse 中的 Tomcat 给出 java.security.UnrecoverableKeyException - 无法恢复密钥错误
【发布时间】:2016-04-30 02:52:00
【问题描述】:

我正在尝试在 Tomcat 中为我的 REST Api 配置对 SSL(HTTPS) 的支持。我在我的 Mac OS X Yosemite 上使用 Eclipse Mars。 我编辑了 Tomcat 的 Server.xml 文件,以启用 SSL。我已经在其中提供了我的密钥库文件的路径。

以下是我的 server.xml 中的连接相关设置:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="9701"/>

<Connector port="9701" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" keystoreFile="/Users/xyz/.keystore" keystorePass="changeit" keyPass="password" sslProtocol="TLS" />

现在当我从 Eclipse 启动 Tomcat 时,出现以下错误:

Jan 23, 2016 7:34:05 PM org.apache.coyote.AbstractProtocol init
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-nio-9701"]
java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
    at java.security.KeyStore.getKey(KeyStore.java:1023)
    at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:133)
    at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:70)
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:608)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:537)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:495)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:650)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
    at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:821)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:642)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:667)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)

为什么我会收到此错误以及如何消除此错误? 我是否需要在我的 REST Api 的 Web.xml 中进行任何更改,以便我只能通过 HTTPS 运行我的 api! 任何帮助将不胜感激。

另外,我用相同的设置在外面运行了 Tomcat,它成功运行了。虽然我承认我对这些东西还很陌生,所以我可能会犯一些小错误。

P.S.:我在网上和 stackoverflow 上搜索了很多。但我找不到我的问题的确切解决方案。我希望这个问题不要重复,即使发生了,请立即在 cmets 中指出,以便我可以删除我的问题并解决我的问题。 谢谢。

【问题讨论】:

  • 您的连接器配置中不需要keyAlias 吗?
  • 嗨@Baderous:所以你的意思是我应该在连接设置中添加另一个属性。就像我应该添加 keyAlias="tomcat" 因为我使用以下命令生成了密钥库文件:$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA。
  • 是的,您可以尝试这样做,但请确保您的密钥库包含与该别名关联的私钥。该命令用于创建私钥,而不是将其存储在密钥库中:alvinalexander.com/java/…
  • @Baderous 我想通了。两个密码必须相同。提及 keyAlias 是可选的。我生成了另一个 .keystore 文件,在该文件中我保持两个密码相同,替换了旧密码并且它起作用了。 Tomcat 成功运行。
  • 是的,keyAlias 是可选的,但建议使用:tomcat.apache.org/tomcat-7.0-doc/config/http.html 密码不必相同:keystorePass 用于访问密钥库; keyPass 用于访问密钥库中的密钥/证书。也许您的密钥库中有多个密钥,并且您使用了错误的 keyPass,或者使用了正确的密钥,但在不使用 keyAlias 时出现了文档中描述的行为。

标签: java eclipse tomcat ssl https


【解决方案1】:

我通过重新生成另一个 .keystore 文件解决了上述问题,在该文件中我保持“key”和“keystore”密码相同。我用新的替换了旧的密钥库文件,它工作正常。

密钥库使用其单独的密码(密钥密码)保护每个私钥,并使用另一个密码(即密钥库密码)保护整个密钥库。我们也可以使用相同的密码。

为这两个字段提供相同的密码使我能够在本地主机上通过 SSL(HTTPS) 访问我的 REST Api。

我在 web.xml 文件中添加了以下代码,以允许仅通过 HTTPS 访问 Api:

  <security-constraint>
            <web-resource-collection>
                <web-resource-name>clientinfo</web-resource-name>
                <url-pattern>/*</url-pattern>
            </web-resource-collection>
            <user-data-constraint>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
            </user-data-constraint>
    </security-constraint>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2013-01-14
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多