2012-01-04 5 views
6

J'utilise Spring RestTemplate dans mon application pour accéder à des services Web externes. Cependant, ce service Web SSL activé avec un certificat auto-signé (domaine, etc ... ne sont pas non plus valides). Ceci est juste sur un réseau local, donc je n'ai pas à m'inquiéter de certains problèmes de sécurité. Je veux que Spring accepte ce certificat. Voilà ce que je l'ai fait jusqu'à présent:Comment définir un certificat de confiance pour un ressort RestTemplate

1.) J'ai configuré mon JBOSS 7 à utiliser ce fichier de clés

<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.) Voici la configuration de mon RestTemplate Bean (J'utilise autowireing dans mes classes)

<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> 

J'ai importé le certificat de serveur dans le keystore, il est définitivement là. Quoi d'autre dois-je faire? J'ai déjà vérifié toutes les questions similaires ici, mais aucune d'elles n'a aidé. Merci.

Répondre

2

Le fichier keystore.jks que vous avez spécifié dans le connecteur pour jboss-web est uniquement utilisé comme certificat de serveur pour les connexions entrantes. Pour les connexions sortantes, JBoss agit comme n'importe quel autre client Java, vous devez donc importer le certificat du serveur dans le magasin de clés de confiance Java par défaut. Vous pouvez utiliser la valeur par défaut% JAVA_HOME% \ lib \ security \ cacerts, et importer votre certificat de serveur en utilisant:

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

Si vous ne voulez pas modifier les cacerts par défaut, vous pouvez définir un truststore alternatif par réglage du système propriétés comme expliqué dans: Java client certificates over HTTPS/SSL.

Une troisième voie consiste à remplacer le https ProtocolSocketFactory pour qu'il accepte tous les certificats, comme: http://drumcoder.co.uk/blog/2011/mar/30/httpclient-self-signed-certificates/

+0

Donc, dans mon cas, je devrais importer le certificat de serveur dans server-keystore.jks? Ou est-ce un keystore distinct pour les certificats de confiance? Et une autre question, dois-je importer le certificat de serveur ou le certificat de l'autorité de certification du serveur? Merci. –

0

J'ai fait une méthode simple:

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; 
} 

Puis, quand je exemple restTemplate:

RestTemplate restTemplate = new RestTemplate(getRequestFactory()); 

Simple.

Questions connexes