简体   繁体   English

HttpClient同时设置SSLHostnameVerifier和ConnectionManager

[英]HttpClient set up SSLHostnameVerifier and ConnectionManager at the same time

Registry<ConnectionSocketFactory> reg =RegistryBuilder<ConnectionSocketFactory>create().register("https", new  
SSLConnectionSocketFactory(ctx)).register("http", new PlainConnectionSocketFactory())
            .build();

    PoolingHttpClientConnectionManager cm = newPoolingHttpClientConnectionManager(reg);

    client = HttpClients.custom()
            .setConnectionManager(cm)
            .setDefaultRequestConfig(config)
            .setSSLHostnameVerifier(new NoopHostnameVerifier())
            .build();

I use NoopHostnameVerifier because I do not want to verify SSL, but in my ConnectionManager exists essential logic and have not chances forgot ConnectionManager. 我使用NoopH​​ostnameVerifier是因为我不想验证SSL,但是在我的ConnectionManager中存在必不可少的逻辑,并且没有机会忘记ConnectionManager。

The problem is that if I have ConnectionManager and SSLHostnameVerifier(NoopHostnameVerifier), I get the following error: 问题是,如果我有ConnectionManager和SSLHostnameVerifier(NoopH​​ostnameVerifier),则会收到以下错误:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated javax.net.ssl.SSLPeerUnverifiedException:对等方未通过身份验证

What might be causing this problem? 是什么导致此问题?

Here is what worked for me. 这对我有用。 I found it here . 我在这里找到的。

PoolingHttpClientConnectionManager cm;
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
            clientBuilder.setSslcontext(sslContext);
            SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslSocketFactory)
                .build();
            cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            cm = new PoolingHttpClientConnectionManager();
        }

You need to use the singleton of NoopHostnameVerifier 您需要使用NoopHostnameVerifier的单例

So change new NoopHostnameVerifier() to NoopHostnameVerifier.INSTANCE 因此,将new NoopHostnameVerifier()更改为NoopHostnameVerifier.INSTANCE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM