我正在尝试在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上搜索了很多。但我无法找到问题的确切解决方案。我希望这个问题不会重复,即使它发生了,请立即在评论中指出,以便我可以删除我的问题并解决我的问题。 感谢。
答案 0 :(得分:0)
我通过重新生成另一个 .keystore 文件来解决上述问题,其中我保留了&#34;键&#34;和&#34; keystore&#34;密码相同。我用新的密钥库文件替换旧的密钥库文件,但它确实有效。
密钥库使用其个人密码(密钥密码)保护每个私钥,并使用另一个密码(即密钥库密码)保护整个密钥库。我们也可以同时使用这两个密码。
为这两个字段提供相同的密码使我能够在localhost上访问我的REST Api over SSL(HTTPS)。
我将以下代码添加到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>