2016-08-26 23 views
5

Tôi đang sử dụng dịch vụ web json bằng cách sử dụng restTemplate Spring3.0 bằng cách gọi phương thức bài đăng.Cách thực thi TLS1.2 cho Khách hàng còn lại bằng cách sử dụng Mẫu còn lại

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

Ứng dụng của chúng tôi được triển khai trong máy chủ WS và cố kết nối nhà sản xuất bằng cách tạo kết nối ổ cắm với TLS1.0. Tuy nhiên, bây giờ nhà sản xuất chỉ hỗ trợ TLS1.1 và TLS1.2.

Cách thực thi restTempate để sử dụng TLS1.1 hoặc TLS 1.2.

Thông thường đối với mã httpclient apache, hãy tạo phương thức tùy chỉnh ProtocolSocketFactory và ghi đè phương thức createSocket. Tuy nhiên, trong trường hợp RestTemplate, làm thế nào để đạt được điều tương tự.

+1

TLS 2.0 không tồn tại, điều này gây khó khăn cho việc 'hỗ trợ'. –

+1

Cảm ơn bạn đã chỉ ra, sửa chữa trong câu hỏi – Panther

Trả lời

4

Bạn có thể định cấu hình RestTemplate để sử dụng tùy chỉnh ClientHttpRequestFactory. Đặc biệt (vì bạn đang sử dụng Spring 3.0), có một CommonsClientHttpRequestFactory. Điều đó sẽ cho phép bạn cấu hình HTTP commons một cách chi tiết, và RestTemplate của bạn sẽ sử dụng nó để thực hiện các yêu cầu của nó.

Xin lưu ý rằng các lớp triển khai thực tế đã thay đổi trong các phiên bản sau của Spring (và nếu bạn vẫn ở trên 3.0 bạn thực sự nên xem xét cập nhật). Từ 3.1 trên lớp thực hiện được gọi là HttpComponentsClientHttpRequestFactory.

11

Với mùa xuân> 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); 
..... 
+1

Đây phải là câu trả lời được chấp nhận, vì nó cung cấp một ví dụ hoàn chỉnh. Điều này hoạt động ra khỏi hộp! – membersound

+0

Làm cách nào để làm điều này với Spring 3.0.x? – abhishekhp

+1

@membersound chấp nhận câu trả lời không phải là về câu trả lời tốt hơn nhưng về những gì làm việc với OP, Và anyways câu hỏi là rõ ràng về mùa xuân 3.0. Tôi cũng đánh giá cao câu trả lời này và đã upvoted – Panther

0

@abhishekhp Nếu câu hỏi của bạn vẫn tăng.

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)); 
Các vấn đề liên quan