2016-01-23 39 views
1

我正在嘗試在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上。但是我找不到解決我的問題的確切辦法。我希望這個問題不會重複,即使發生了,請立即在評論中指出,以便我可以刪除我的問題並解決我的問題。 謝謝。

+0

不要在您的連接器配置需要一個'keyAlias'? – Baderous

+0

嗨@Baderous:所以你的意思是我應該在連接設置中添加另一個屬性。 像我應該添加** keyAlias =「tomcat」**因爲我使用以下命令生成密鑰庫文件:$ JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA。 –

+0

是的,你可以嘗試,但要確保你的密鑰庫包含與該別名關聯的私鑰。該命令用於創建私鑰,而不是將其存儲在密鑰庫中:http://alvinalexander.com/java/java-using-keytool-genkey-private-key-keystore – Baderous

回答

0

我通過重新生成另一個.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> 
相關問題