Java8で使用するTLSのバージョン事情
http://blogger.shase.info/2015/05/java8tls.html
あたりまえだけど、全部に適用されてしまうわけでして。
特定の通信だけ明示的に指定したいケースを考えてみる。
環境
Spring 4.1.xJava 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-sslgistとか貼ったほうが見やすいね。(。-人-。) ゴメーン