Как настроить Spring RestTemplate с SSL (в Spring @MVC)

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

// Конфигурации Spring Security 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 \ bin> keytool -genkey -keystore keystore_client -alias clientKey -dname "CN = localhost, OU = Dev, O = MyBusiness, L = Colombo, S = Westen, 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: \ jdk1.6.0_23 \ bin> keytool -export -alias serverKey -rfc -keystore keystore_server> server.cert

// Импортировать сертификаты в соответствующие хранилища доверенных сертификатов:

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

// Конфигурации Spring 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>

// URL Https для доступа

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

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

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


person Channa    schedule 27.10.2011    source источник


Ответы (3)


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

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

    keytool -import -keystore jdk1.8.0_77/jre/lib/security/cacerts -file ~/test.cer -alias test
    
person Peter Szanto    schedule 02.11.2011
comment
Можно ли поддерживать сертификат клиента на уровне сервера приложений без настройки на уровне Java? - person Eranda; 10.11.2016
comment
Вы можете импортировать сертификат в файл настраиваемого хранилища доверенных сертификатов, а затем указать его, как описано здесь: stackoverflow.com/a/18767045/157591 или вы можете поэкспериментировать с вещами, описанными здесь stackoverflow.com/a/6755459/157591 - person Peter Szanto; 05.12.2016

Вы можете настроить RestTemplate с помощью HttpComponentsClientHttpRequestFactory из Apache HttpComponents HttpClient, что определенно поддерживает SSL.

ref: Поддерживает ли REST (RestTemplate) в библиотеке Spring протокол HTTPS?

person user2767141    schedule 11.09.2013

Вариант для Spring Boot:

  1. Добавить зависимость:

     implementation 'org.apache.httpcomponents:httpclient:4.5'    
    
  2. Предоставьте bean-компонент RestTemplate:

@Bean
private RestTemplate restTemplate() {
        SSLContext sslContext = buildSslContext();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);

        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);

        return new RestTemplate(factory);
    }

private SSLContext buildSslContext() {
        try {
            char[] keyStorePassword = sslProperties.getKeyStorePassword();
            return new SSLContextBuilder()
                    .loadKeyMaterial(
                            KeyStore.getInstance(new File(sslProperties.getKeyStore()), keyStorePassword),
                            keyStorePassword
                    ).build();
        } catch (Exception ex) {
            throw new IllegalStateException("Unable to instantiate SSL context", ex);
        } finally {
            sslProperties.setKeyStorePassword(null);
            sslProperties.setTrustStorePassword(null);
        }
    }
  1. Укажите необходимые свойства SSL в файле application.properties или application.yaml:
server:
    ssl:
        enabled: true
        key-store: /path/to/key.keystore
        key-store-password: password
        key-alias: alias
        trust-store: /path/to/truststore
        trust-store-password: password

Вот и все. Теперь вы можете видеть, что ваш Tomcat запускается на 8080 (или другом порту) (https). В качестве альтернативы вы можете использовать мой Spring Boot Starter

person Eugene Lesnov    schedule 03.12.2020