On Tue, 2014-12-16 at 18:08 +0000, Pete Keyes wrote:
> Below is a unit test that attempts to use the 
> "SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER" option.  It never 
> works and the wire level debug indicates that HC is always using 
> "BrowserCompatHostnameVerifier" instead.  Can someone explain why or where my 
> code is incorrect?
> 
...

Hi Pete

You need to be careful when using a custom connection manager. When used
it overrides all other custom connection management related settings.
For details see HttpClientBuilder javadocs.

---
X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
    @Override
    public void verify(final String host, final SSLSocket ssl) throws 
IOException {
        System.out.println("I am easy");
    }
    @Override
    public void verify(final String host, final X509Certificate cert) throws 
SSLException {
        System.out.println("I am easy");
    }
    @Override
    public void verify(final String host, final String[] cns, final String[] 
subjectAlts) throws SSLException {
        System.out.println("I am easy");
    }
    @Override
    public boolean verify(final String s, final SSLSession sslSession) {
        System.out.println("I am easy");
        return true;
    }
};

CloseableHttpClient client1 = HttpClients.custom()
        .setHostnameVerifier(hostnameVerifier)
        .build();
CloseableHttpResponse response1 = client1.execute(new 
HttpGet("https://verisign.com/";));
try {
    System.out.println(response1.getStatusLine());
} finally {
    response1.close();
}

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
        SSLContexts.createSystemDefault(), hostnameVerifier);
Registry<ConnectionSocketFactory> registry = 
RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.getSocketFactory())
        .register("https", sslSocketFactory)
        .build();
BasicHttpClientConnectionManager cm = new 
BasicHttpClientConnectionManager(registry);
CloseableHttpClient client2 = HttpClients.custom()
        .setConnectionManager(cm)
        .build();
CloseableHttpResponse response2 = client2.execute(new 
HttpGet("https://verisign.com/";));
try {
    System.out.println(response2.getStatusLine());
} finally {
    response2.close();
}
---

In both cases custom hostname verifier was called for me. 

Hope this helps

Oleg



---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to