Как установить сертификат для доверия к пружинному RestTemplate - PullRequest
6 голосов
/ 04 января 2012

Я использую Spring RestTemplate в своем приложении для доступа к внешним веб-сервисам.Этот веб-сервис с поддержкой SSL, однако, с самозаверяющим сертификатом (домен и т. Д. Также недействительны).Это только в локальной сети, поэтому мне не нужно беспокоиться о некоторых проблемах безопасности.Я хочу, чтобы Spring принял этот сертификат.Это то, что я сделал до сих пор:

1.) Я настроил свой JBOSS 7 для использования этого хранилища ключей

<connector name="https" protocol="HTTP/1.1" socket-binding="https" scheme="https" enable-lookups="false" secure="true">
    <ssl name="ssl" key-alias="my-private-key" password="rmi+ssl" certificate-key-file="../standalone/configuration/server-keystore.jks" protocol="TLSv1" verify-client="false"/>
</connector>

2.) Вот конфигурация моего компонента RestTemplate (Я использую автопроводку в своих классах)

<bean id="stringHttpConverter" class="org.springframework.http.converter.StringHttpMessageConverter"></bean>

<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">
    <property name="authenticationPreemptive" value="true"/>
    <property name="connectionManagerClass" value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"/>
</bean>

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg ref="httpClientParams"/>
</bean>

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

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg ref="httpClientFactory"/>
    <property name="messageConverters">
        <list>
            <!-- <ref bean="marshallingConverter" /> -->
            <ref bean="stringHttpConverter" />              
        </list>
    </property>
</bean>

Я импортировал сертификат сервера в хранилище ключей, оно определенно там.Что еще мне нужно сделать?Я уже проверил все подобные вопросы здесь, но ни один из них не помог.Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Сервер-keystore.jks, который вы указали в соединителе для jboss-web, используется только в качестве сертификата сервера для входящих соединений.

Для исходящих соединений JBoss действует как любой другой клиент Java, поэтому вам необходимо импортировать сертификат сервера в хранилище доверенных сертификатов Java по умолчанию. Вы можете использовать по умолчанию% JAVA_HOME% \ lib \ security \ cacerts и импортировать сертификат сервера, используя:

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias mycert -file mycert.cer

Если вы не хотите редактировать кадры по умолчанию, вы можете определить альтернативное хранилище доверенных сертификатов, установив системные свойства, как описано в: Сертификаты клиента Java по HTTPS / SSL .

Третий способ - переопределить протокол https ProtocolSocketFactory, чтобы он принимал все сертификаты, например: http://drumcoder.co.uk/blog/2011/mar/30/httpclient-self-signed-certificates/

0 голосов
/ 03 августа 2017

Я сделал простой метод:

static HttpComponentsClientHttpRequestFactory requestFactory = null;

/**
 *
 * @return
 */
public static ServerProperties getServerProperties() {
    return serverProperties;
}

/**
 * @return
 */
public static HttpComponentsClientHttpRequestFactory getRequestFactory() {
    if (requestFactory == null) {
        TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
            @Override
            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                return true;
            }
        };
        SSLContext sslContext = null;
        try {
            sslContext = org.apache.http.ssl.SSLContexts.custom()
                    .loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
            SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

            CloseableHttpClient httpClient = HttpClients.custom()
                    .setSSLSocketFactory(csf)
                    .build();
            requestFactory = new HttpComponentsClientHttpRequestFactory();
            requestFactory.setHttpClient(httpClient);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
    }
    return requestFactory;
}

Затем, когда я создаю экземпляр restTemplate:

 RestTemplate  restTemplate = new RestTemplate(getRequestFactory());

Простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...