web-dev-qa-db-ja.com

PoolingHttpClientConnectionManager:Httpsリクエストを実行する方法は?

現在、HttpGetを使用して複数のCloseableHttpClientリクエストを同時に実行しようとしています。
それを行う方法をグーグルで検索したところ、答えはPoolingHttpClientConnectionManagerを使用することでした。

この時点で私はこれを手に入れました:

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

次に、_http://www.google.com_へのHttpGetリクエストを試しましたが、すべて正常に機能しました。

次に、cmdを使用してトラストストアを作成し、対象のWebサイトの証明書をインポートし、トラストストアでSSLConnectionSocketFactoryを設定し、SSLSocketFactoryhttpClientを設定します。

_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ツールを作成しません)

前もって感謝します!

追伸:私はHttpComponents4.3.1を使用しています

10
TorbenJ

答えが見つかりました: https://stackoverflow.com/a/19950935/122325

追加する必要がありました

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

socketFactoryRegistryをパラメーターとしてPoolingHttpClientConnectionManagerのコンストラクターに渡します。今では問題なく動作します:)

20
TorbenJ