web-dev-qa-db-fra.com

Comment appliquer le client TLS1.2 au repos à l'aide du modèle de repos

Je consomme json webservice en utilisant Spring3.0 restTemplate en appelant post method. 

        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);      
        HttpEntity<Object> entity = new HttpEntity<Object>(requestAsString, headers);
        postForObject = restTemplate.postForObject(url, entity, responseClass );

Notre application est déployée sur un serveur WAS et tente de connecter le producteur en créant une connexion de socket avec TLS1.0. Cependant, maintenant, le producteur ne supporte que TLS1.1 et TLS1.2.

Comment imposer à restTempate d'utiliser TLS1.1 ou TLS 1.2.

Normalement, pour le code httpclient Apache, créez une ProtocolSocketFactory personnalisée et substituez la méthode createSocket. Cependant, dans le cas de RestTemplate, comment y parvenir.

7
Panther

Vous pouvez configurer votre RestTemplate pour utiliser une ClientHttpRequestFactory personnalisée. En particulier (puisque vous utilisez Spring 3.0), il existe un CommonsClientHttpRequestFactory . Cela vous permettra de configurer en détail le HTTP commun, et votre RestTemplate l'utilisera pour exécuter ses requêtes.

Veuillez noter que les classes d'implémentation réelles ont changé dans les versions ultérieures de Spring (et si vous êtes toujours sur la version 3.0, vous devriez vraiment envisager de le mettre à jour). À partir de 3.1, la classe d'implémentation s'appelle HttpComponentsClientHttpRequestFactory.

5
marthursson

Au printemps> 3.1:

import javax.net.ssl.SSLContext;
import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClientBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, null, null);

CloseableHttpClient httpClient = HttpClientBuilder.create().setSSLContext(context)
    .build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);
.....
17
Michal Foksa

@abhishekhp Si votre question est toujours d'actualité.

    RestTemplate restTemplate = new RestTemplate();
    DefaultHttpClient httpClient = new DefaultHttpClient();
    // We're going to try and load and enable TLS version 1.2 standard communication context from JSSE Providers
    // This is enabled only for download media Mirakl as some merchants don't accept communication with TLS versions prior to 1.1
    try {
        SSLContext context;
        context = SSLContext.getInstance("TLSv1.2");
        context.init(null, null, null);

        SSLSocketFactory ssf = new SSLSocketFactory(context);
        ClientConnectionManager ccm = httpClient.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
        sr.register(new Scheme("https", 443, ssf));

    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        LOGGER.warn("Could not load the TLS version 1.2 due to => ", e);
    }

    restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
1
Med Arrafi