2015年5月8日金曜日

RestTemplateで使用するTLSのバージョンを指定する

昨日書いたこれは

Java8で使用するTLSのバージョン事情
http://blogger.shase.info/2015/05/java8tls.html

あたりまえだけど、全部に適用されてしまうわけでして。

特定の通信だけ明示的に指定したいケースを考えてみる。

環境

Spring 4.1.x
Java 8.x
apache httpclient 4.4.x

とりあえずfactoryのところ変えてみたよ、って感じ。
SimpleClientHttpRequestFactoryはjavaの設定そのままなので、HttpComponentsClientHttpRequestFactoryを使ってみました。

before

// request factoryの生成
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory() {
};

// factoryになんかセットしたりする


// リクエスト
HttpEntity<String> request = new HttpEntity<String>(requestHeaders);
String url = "https://localhost"
RestTemplate restTemplate = new RestTemplate(factory);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); 

after

 // request factoryの生成
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
SSLContext sslContext = null;

try {
  sslContext = SSLContext.getInstance("TLSv1.2");
  sslContext.init(null, null, null);
  } catch (Exception e) {
    //todo:
  }

  SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(sslContext);
  CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sf).setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
  factory.setHttpClient(httpClient);

 // リクエスト
 HttpEntity<String> request = new HttpEntity<String>(requestHeaders);
 String url = "https://localhost"
 RestTemplate restTemplate = new RestTemplate(factory);
 ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
 

参考にした

http://www.baeldung.com/httpclient-ssl


gistとか貼ったほうが見やすいね。(。-人-。) ゴメーン

0 件のコメント:

コメントを投稿