2011-10-27 4 views
10

Я хочу настроить мой Spring @MVC STUB приложения Spring RestTemplate с SSL для общения с REST база HTTPS приложения, которые развернуты на Сервер Tomcat (весна 3, Tomcat 7). Я до сих пор делал свои работы на refer this link. Теперь я не знаю, как использовать эти сгенерированные сертификаты с Spring RestTemplate, может у кого-нибудь есть идея, пожалуйста, помогите мне. Благодарю. До сих пор вещи, которые я сделал,Как настроить Spring RestTemplate с SSL (в Spring @MVC)

// Spring Security Configurations XML

<http> 
    <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>  
    <http-basic/></http> 

// Конфигурации для включения SSL с Tomcat

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" 
    scheme="https" secure="true" SSLEnabled="true" 
    keystoreFile="C:\Users\Channa\.keystore" keystorePass="changeit" 
    clientAuth="false" sslProtocol="TLS"/> 

Для генерации ключей, сертификатов и т.д. ,

// Создание клиента и услуги вер клавиши:

F: \ jdk1.6.0_23 \ бен> Keytool -genkey -keystore keystore_client -alias clientKey -dNAME «CN = локальный, OU = Дев, O = MyBusiness, L = Colombo, S = Вестен, C = SL "
F: \ jdk1.6.0_23 \ bin> keytool -genkey -keystore keystore_server -alias serverKey -dname" CN = localhost, OU = Dev, O = MyBusiness, L = Colombo, S = Westen, C = SL»

// Сгенерировать клиентские и серверные сертификаты:

F: \ jdk1.6.0_23 \ Bin> Keytool -export -alias clientKey -rfc -keystore keystore_client> client.cert F: \ JDK 1.6.0_23 \ Bin> Keytool -export -alias serverKey -rfc -keystore keystore_server> server.cert

// Импорт сертификатов на соответствующие truststores:

F: \ jdk1.6.0_23 \ Bin> Keytool -import -alias clientCert -file client.cert -keystore truststore_server F: \ jdk1.6.0_23 \ Bin> Keytool -import -alias serverCert -file server.cert -keystore truststore_client

// Весна RestTemplate конфигурации

<!--Http client--> 
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <constructor-arg ref="httpClientParams"/> 
    <property name="state" ref="httpState"/> 
</bean> 

<!--Http state--> 
<bean id="httpState" class="com.org.imc.test.stub.http.CustomHttpState"> 
    <property name="credentials" ref="usernamePasswordCredentials"/> 
</bean> 

<!--User name password credentials--> 
<bean id="usernamePasswordCredentials" class="org.apache.commons.httpclient.UsernamePasswordCredentials"/> 

<!--Http client--> 
<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean> 

<!--RestTemplate--> 
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg ref="httpClientFactory"/> 
</bean> 

// Https URL будет доступ

ResponseEntity<User> rECreateUser = restTemplate.postForEntity("https://127.0.0.1:8443/skeleton-1.0/login", user, User.class); 

// исключение в настоящее время я получил:

org.springframework.web.client.ResourceAccessException: I/O: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти допустимый путь сертификации для запрошенной цели; Вложенное исключение - javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации для запрошенной цели

ответ

7

Это потому, что SSL-сертификат вызываемой службы не подписан доверенным центром сертификации. Обходной путь заключается в том, чтобы импортировать сертификат в хранилище доверия сертификатов (cacerts) вашей JRE.

  1. Загрузить сертификат, открыв URL-адрес в браузере, щелкните значок в адресной строке браузера.
  2. После того, как у вас есть файл .cer выполнить следующую команду

    keytool -import -keystore jdk1.8.0_77/jre/lib/security/cacerts -file ~/test.cer -alias test 
    
+3

Можно ли сохранить клиентский сертификат на уровне сервера приложений, не настраивая на уровне Java? – Eranda

+1

Вы можете импортировать сертификат в пользовательский файл хранилища доверия, а затем указать его, как описано здесь: http://stackoverflow.com/a/18767045/157591, или вы можете поэкспериментировать с описанными здесь функциями http://stackoverflow.com/a/ 6755459/157591 –

Смежные вопросы