У нас есть компонент весенней загрузки, который вызывает различные сторонние системы, такие как
- Vodafone, для которого требуется SSL-рукопожатие
- , и другие, в которых нам необходимо игнорировать все сертификаты.
При вызове # 2 просто без какого-либо SSL:
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
LOG.info("Sending request to url#{}", url);
LOG.info("URI {}", url);
HttpGet h = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(h);
...
Получаем ошибку:
SimpleAsyncTaskExecutor-1 | exstart [javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
Мы попытался создать локальный RestTemplate, который игнорирует все сертификаты, но в другом месте сломал bean-компонент @Autowired RestTemplate.
Как правильно это сделать?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Предложение Tried Smile по-прежнему не работает для клиентов, которым требуется SSL
@Bean
@Qualifier("RestTemplate")
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* This will return a restTemplate object that will ignore all ssl
* certificate validation
*
* @return
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
@Bean
@Qualifier("RestTemplateNonSSL")
public RestTemplate RestTemplateNonSSL() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return new RestTemplate(requestFactory);
}