代码之家  ›  专栏  ›  技术社区  ›  User3

使用PoolingHttpClientConnectionManager在HttpClient上禁用SSL

  •  2
  • User3  · 技术社区  · 7 年前

    我正在尝试禁用我的 CloseableHttpAsyncClient .以下是我使用的代码:

    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 也然而,我不知道如何做到这一点。任何提示都会有帮助

    1 回复  |  直到 7 年前
        1
  •  3
  •   ok2c    7 年前

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

    要么让 HttpAsyncClientBuilder 在内部创建连接管理器

    SSLContext sslContext = new SSLContextBuilder()
            .loadTrustMaterial(null, (x509Certificates, s) -> true)
            .build();
    
    HttpAsyncClientBuilder.create()
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .setSSLContext(sslContext)
            .build();
    

    实例到 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();