2016-01-23 2 views
1

Я пытаюсь настроить поддержку SSL (HTTPS) в Tomcat для моего REST Api. Я использую Eclipse Mars на своей Mac OS X Yosemite. Я отредактировал файл Server.xml Tomcat, чтобы включить SSL. Я предоставил путь к моему файлу хранилища ключей.Tomcat в Eclipse, предоставляющий 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" /> 

Теперь, когда я начинаю Tomcat с Eclipse, я получаю следующее сообщение об ошибке:

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) 

Почему я получаю эта ошибка и как удалить эту ошибку? И мне нужно внести какие-либо изменения в Web.xml моего REST Api, чтобы я мог запускать api поверх HTTPS только! Любая помощь будет очень оценена.

Кроме того, я управлял Tomcat снаружи с теми же настройками, и он успешно бежал. Хотя я признаю, что я довольно новичок в этих вещах, и поэтому я мог бы сделать небольшую ошибку.

P.S .: Я много искал в Интернете и в stackoverflow. Но я не мог найти точного решения моей проблемы. Я надеюсь, что этот вопрос не будет дублироваться, и даже если это произойдет, немедленно сообщите об этом в комментариях, чтобы я мог удалить свой вопрос и решить мою проблему. Спасибо.

+0

ли вам не нужен 'keyAlias' в вашей Connector конфигурации? – Baderous

+0

Привет @Baderous: значит, вы должны добавить еще один атрибут в настройках Connection. Как я должен добавить ** 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, где я сохранил оба пароля «ключ» и «хранилище ключей». Я заменил старый файл хранилища ключей новым, и он сработал.

Хранилище ключей защищает каждый закрытый ключ с его индивидуальным паролем (ключ пароля), а также защищает все хранилище ключей с другим паролем (который является паролем хранилище ключей). У нас также могут быть оба пароля.

Предоставление одинакового пароля для обоих полей позволило мне получить доступ к моему REST Api через SSL (HTTPS) на localhost.

Я добавил следующий код в файл web.xml, чтобы позволить Api для доступа через HTTPS только:

<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> 
Смежные вопросы