Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse中的Tomcat提供java.security.UnrecoverableKeyException-无法恢复密钥错误_Java_Eclipse_Tomcat_Ssl_Https - Fatal编程技术网

Eclipse中的Tomcat提供java.security.UnrecoverableKeyException-无法恢复密钥错误

Eclipse中的Tomcat提供java.security.UnrecoverableKeyException-无法恢复密钥错误,java,eclipse,tomcat,ssl,https,Java,Eclipse,Tomcat,Ssl,Https,我试图在Tomcat中为我的RESTAPI配置对SSL(HTTPS)的支持。我正在我的Mac OS X Yosemite上使用Eclipse Mars。 我编辑了Tomcat的Server.xml文件,以启用SSL。我在其中提供了密钥库文件的路径 以下是myserver.xml中与连接相关的设置: <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="9701"/> &l

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

以下是myserver.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)
2016年1月23日7:34:05 PM org.apache.coyote.AbstractProtocol init
严重:未能初始化与ProtocolHandler[“http-nio-9701”]关联的端点
java.security.UnrecoverableKeyException:无法恢复密钥
位于sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
位于sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
位于sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
位于sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
位于sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
位于java.security.KeyStore.getKey(KeyStore.java:1023)
位于sun.security.ssl.SunX509KeyManagerImpl.(SunX509KeyManagerImpl.java:133)
位于sun.security.ssl.keymanagerfactorympl$SunX509.engineInit(keymanagerfactorympl.java:70)
位于javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)
位于org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManager(JSSESocketFactory.java:608)
位于org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManager(JSSESocketFactory.java:537)
位于org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:495)
位于org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:650)
位于org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
位于org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
位于org.apache.catalina.connector.connector.initInternal(connector.java:978)
位于org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
位于org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
位于org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
位于org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:821)
位于org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
位于org.apache.catalina.startup.catalina.load(catalina.java:642)
位于org.apache.catalina.startup.catalina.load(catalina.java:667)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
位于org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)
为什么会出现此错误以及如何删除此错误? 我是否需要在RESTAPI的Web.xml中进行任何更改,以便只通过HTTPS运行我的Api! 任何帮助都将不胜感激

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

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

我通过重新生成另一个.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>

客户端信息
/*
保密的

我通过重新生成另一个.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>

客户端信息
/*
保密的

您的连接器配置中不需要
keyalis
吗?您好@Baderous:您的意思是我应该在连接设置中添加另一个属性。我应该添加keyAlias=“tomcat”,因为我使用以下命令生成了密钥库文件:$JAVA_HOME/bin/keytool-genkey-alias tomcat-keyalg RSA。是的,您可以尝试,但请确保您的密钥库包含与该别名相关联的私钥。该命令用于创建私钥,而不是将其存储在密钥库中:@Baderous我找到了它。两个密码必须相同。提及keyAlias是可选的。我生成了另一个.keystore文件