web-dev-qa-db-ja.com

Restテンプレートを使用してTLS1.2をRestクライアントに強制する方法

私は、postメソッドを呼び出すことにより、Spring3.0のrestTemplateを使用してjson Webサービスを使用しています。

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

私たちのアプリケーションはWASサーバーにデプロイされ、TLS1.0とのソケット接続を作成することによってプロデューサーを接続しようとしています。ただし、現在、プロデューサーはTLS1.1およびTLS1.2のみをサポートしています。

RestTempateがTLS1.1またはTLS 1.2を使用するように強制する方法。

通常、Apache httpclientコードでは、カスタムProtocolSocketFactoryを作成し、createSocketメソッドをオーバーライドします。ただし、RestTemplateの場合は、それを実現する方法。

10
Panther

カスタムClientHttpRequestFactoryを使用するようにRestTemplateを構成できます。特に(Spring 3.0を使用しているため) CommonsClientHttpRequestFactory があります。これにより、コモンズHTTPを詳細に設定でき、RestTemplateはそれを使用してリクエストを実行します。

Springの以降のバージョンでは実際の実装クラスが変更されていることに注意してください(まだ3.0を使用している場合は、更新を検討する必要があります)。 3.1以降、実装クラスはHttpComponentsClientHttpRequestFactoryと呼ばれます。

5
marthursson

Spring> 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);
.....
25
Michal Foksa

@abhishekhpあなたの質問がまだある場合。

    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));
2
Med Arrafi