我正在嘗試在Tomcat中爲我的REST API配置對SSL(HTTPS)的支持。我在Mac OS X Yosemite上使用Eclipse Mars。 我編輯了Tomcat的Server.xml文件來啓用SSL。我已經提供了我的密鑰庫文件的路徑。Eclipse中的Tomcat提供java.security.UnrecoverableKeyException-無法恢復關鍵錯誤
以下是我在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上。但是我找不到解決我的問題的確切辦法。我希望這個問題不會重複,即使發生了,請立即在評論中指出,以便我可以刪除我的問題並解決我的問題。 謝謝。
不要在您的連接器配置需要一個'keyAlias'? – Baderous
嗨@Baderous:所以你的意思是我應該在連接設置中添加另一個屬性。 像我應該添加** keyAlias =「tomcat」**因爲我使用以下命令生成密鑰庫文件:$ JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA。 –
是的,你可以嘗試,但要確保你的密鑰庫包含與該別名關聯的私鑰。該命令用於創建私鑰,而不是將其存儲在密鑰庫中:http://alvinalexander.com/java/java-using-keytool-genkey-private-key-keystore – Baderous