PoolingHttpClientConnectionManager: как выполнять запросы HTTPS?

В настоящее время я пытаюсь выполнить несколько запросов HttpGet одновременно с CloseableHttpClient.
Я погуглил, как это сделать, и ответ был использовать PoolingHttpClientConnectionManager.

На данный момент я получил это:

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cManager)
    .build();

Затем я попробовал HttpGet запросить http://www.google.com, и все заработало нормально.

Затем я создал хранилище доверенных сертификатов с помощью cmd и импортировал сертификат целевого веб-сайта, настроил SSLConnectionSocketFactory с моим хранилищем доверенных сертификатов и установил SSLSocketFactory из httpClient:

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore"));
trustStore.load(inputStream, "nopassword".toCharArray());
inputStream.close();

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
    .setSSLSocketFactory(sslsf)
    .setConnectionManager(cManager)
    .build();

Если я попытаюсь выполнить HTTPS HttpGet, я получу исключение PKIX path building failed.
Если я сделаю то же самое без .setConnectionManager(cManager), все будет работать нормально.

Может ли кто-нибудь из вас сказать мне, как я могу заставить это работать? (Не волнуйтесь, я не создаю никаких ddos-инструментов)

Заранее спасибо!

P.S.: я использую HttpComponents 4.3.1


person TorbenJ    schedule 11.12.2013    source источник
comment
` CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(sslsf) .setConnectionManager(cManager) .build(); ` Установка SSLSocketFacotry() здесь бесполезна, так как используется фабрика сокетов, установленная внутри менеджера соединений через реестр. Поэтому, когда вы устанавливаете диспетчер соединений, не нужно устанавливать sslsocketfactory() при создании клиента.   -  person Dheeraj Kumar Gopali    schedule 12.01.2021


Ответы (1)


Нашел ответ: https://stackoverflow.com/a/19950935/1223253

Просто нужно было добавить

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();

и передайте socketFactoryRegistry в качестве параметра конструктору PoolingHttpClientConnectionManager. Теперь работает нормально :)

person TorbenJ    schedule 11.12.2013
comment
Как использовать PoolingHttpClientConnectionManager после создания этого, мой код работает, но я хочу знать, работает ли пул соединений или нет - person Labeo; 24.09.2015
comment
включите ведение журнала клиента для проверки аренды из пула соединений: http://hc.apache.org/httpcomponents-client-ga/logging.html - person Jake B; 09.07.2016
comment
отлично, я потратил на это 2 дня, и с вашей помощью это решилось за 5 минут. Хотел бы я, чтобы я видел это раньше .. Спасибо. - person Rahul Singh; 20.05.2018
comment
Если вам нужен «http», а также «https», проверьте этот комментарий — stackoverflow.com/a/20491564/3010484 - person hipokito; 19.03.2020