使用 PoolingNHttpClientConnectionManager 在 HttpClient 上禁用 SSL

Disable SSL on HttpClient with PoolingNHttpClientConnectionManager

我正在尝试在 CloseableHttpAsyncClient 上禁用 SSL。下面是我使用的代码:

private synchronized CloseableHttpAsyncClient getCloseableClient() throws Exception {
    if (closeableHttpAsyncClient == null) {
        logger.info("New Async Client created ");
        closeableHttpAsyncClient = HttpAsyncClientBuilder.create()
                .setDefaultRequestConfig(createConnConfig())
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                            @Override
                            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {
                                return true;
                            }
                        }).build())
                // .setKeepAliveStrategy(kepAliveStrategy) TODO
                .setConnectionManager(createPoolingConnManager()).build();

        closeableHttpAsyncClient.start();
    }
    return closeableHttpAsyncClient;
}

然而,当我 运行 以上时,我仍然得到:

javax.net.ssl.SSLHandshakeException: General SSLEngine problem

这里可能有什么问题,我想我也必须修改我的 PoolingNHttpClientConnectionManager。但是我不知道该怎么做。任何指针都会有所帮助

您的代码的问题是 #setConnectionManager 调用覆盖 #setSSLContext 导致 SSLContext 实例无效。

HttpAsyncClientBuilder在内部创建一个连接管理器

SSLContext sslContext = new SSLContextBuilder()
        .loadTrustMaterial(null, (x509Certificates, s) -> true)
        .build();

HttpAsyncClientBuilder.create()
        .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
        .setSSLContext(sslContext)
        .build();

或者将 SSLContext 实例作为构造函数参数传递给 PoolingNHttpClientConnectionManager

SSLContext sslContext = new SSLContextBuilder()
        .loadTrustMaterial(null, (x509Certificates, s) -> true)
        .build();

Registry<SchemeIOSessionStrategy> registry = RegistryBuilder.<SchemeIOSessionStrategy>create()
    .register("http", NoopIOSessionStrategy.INSTANCE)
    .register("https", new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE))
    .build();

DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor();
HttpAsyncClientBuilder.create()
        .setConnectionManager(new PoolingNHttpClientConnectionManager(ioReactor, registry))
        .build();