Spring Boot: как использовать Multiple RestTemplates? совершать звонки с проверкой SSL-сертификата и без него условно - PullRequest
0 голосов
/ 29 января 2020

У нас есть компонент весенней загрузки, который вызывает различные сторонние системы, такие как

  1. Vodafone, для которого требуется SSL-рукопожатие
  2. , и другие, в которых нам необходимо игнорировать все сертификаты.

При вызове # 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);
    }

1 Ответ

1 голос
/ 29 января 2020

Сохраните два разных боба для RestTemplate и используйте @Qualifier("SOME NAME SIGNIFYING SSL OR NOT") для различения двух бобов.

Например,

@Bean(name="RestTemplateSSL")
public RestTemplate restTemplateSSL(){
    // Create and return SSL specific RestTemplate
}

@Bean(name="RestTemplateNonSSL")
public RestTemplate restTemplateNonSSL(){
    // Create and return Non-SSL specific RestTemplate
}

Использование:

@Autowired
@Qualifier("RestTemplateSSL")
private RestTemplate restTemplateSSL;

@Autowired
@Qualifier("RestTemplateNonSSL")
private RestTemplate restTemplateNonSSL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...