2012-01-04 4 views
6

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

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 (я использую autowireing в моих классах)

<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

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

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

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

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

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

+0

Так что в моем случае я должен импортировать сертификат сервера в server-keystore.jks? Или это отдельное хранилище ключей для доверенных сертификатов? И еще один вопрос: следует ли импортировать сертификат сервера или сертификат CA сервера? Благодарю. –

0

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

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()); 

Простой.

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