如何使用 Rest 模板将 TLS1.2 强制实施到 Rest 客户端

2022-09-03 09:07:25

我正在通过调用post方法使用Spring3.0 restTemplate使用json Webservice。

        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。

如何强制重试以使用 TLS1.1 或 TLS 1.2。

通常对于apache httpclient代码,创建自定义的PropertSocketFactory并覆盖createSocket方法。但是,在RestTemplate的情况下,如何实现相同的目标。


答案 1

使用春季> 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);
.....

答案 2

您可以将 RestTemplate 配置为使用自定义 .特别是(因为你使用的是Spring 3.0),有一个CommonsClientHttpRequestFactory。这将使您能够详细配置共享资源HTTP,并且您的RestTemplate将使用它来执行其请求。ClientHttpRequestFactory

请注意,在更高版本的Spring中,实际的实现类已经发生了变化(如果你还在3.0上,你真的应该考虑更新)。从 3.1 开始,实现类称为 。HttpComponentsClientHttpRequestFactory


推荐