How to ignore SSL certificate errors in Apache HttpClient 4.0 How to ignore SSL certificate errors in Apache HttpClient 4.0 java java

How to ignore SSL certificate errors in Apache HttpClient 4.0


All of the other answers were either deprecated or didn't work for HttpClient 4.3.

Here is a way to allow all hostnames when building an http client.

CloseableHttpClient httpClient = HttpClients    .custom()    .setHostnameVerifier(new AllowAllHostnameVerifier())    .build();

Or if you are using version 4.4 or later, the updated call looks like this:

CloseableHttpClient httpClient = HttpClients    .custom()    .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)    .build();


You need to create a SSLContext with your own TrustManager and create HTTPS scheme using this context. Here is the code,

SSLContext sslContext = SSLContext.getInstance("SSL");// set up a TrustManager that trusts everythingsslContext.init(null, new TrustManager[] { new X509TrustManager() {            public X509Certificate[] getAcceptedIssuers() {                    System.out.println("getAcceptedIssuers =============");                    return null;            }            public void checkClientTrusted(X509Certificate[] certs,                            String authType) {                    System.out.println("checkClientTrusted =============");            }            public void checkServerTrusted(X509Certificate[] certs,                            String authType) {                    System.out.println("checkServerTrusted =============");            }} }, new SecureRandom());SSLSocketFactory sf = new SSLSocketFactory(sslContext);Scheme httpsScheme = new Scheme("https", 443, sf);SchemeRegistry schemeRegistry = new SchemeRegistry();schemeRegistry.register(httpsScheme);// apache HttpClient version >4.2 should use BasicClientConnectionManagerClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);HttpClient httpClient = new DefaultHttpClient(cm);


Apache HttpClient 4.5.5

HttpClient httpClient = HttpClients            .custom()            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)            .build();

No deprecated API has been used.

Simple verifiable test case:

package org.apache.http.client.test;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpUriRequest;import org.apache.http.conn.ssl.NoopHostnameVerifier;import org.apache.http.impl.client.HttpClients;import org.apache.http.ssl.SSLContextBuilder;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.security.KeyManagementException;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;public class ApacheHttpClientTest {    private HttpClient httpClient;    @Before    public void initClient() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {        httpClient = HttpClients                .custom()                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)                .build();    }    @Test    public void apacheHttpClient455Test() throws IOException {        executeRequestAndVerifyStatusIsOk("https://expired.badssl.com");        executeRequestAndVerifyStatusIsOk("https://wrong.host.badssl.com");        executeRequestAndVerifyStatusIsOk("https://self-signed.badssl.com");        executeRequestAndVerifyStatusIsOk("https://untrusted-root.badssl.com");        executeRequestAndVerifyStatusIsOk("https://revoked.badssl.com");        executeRequestAndVerifyStatusIsOk("https://pinning-test.badssl.com");        executeRequestAndVerifyStatusIsOk("https://sha1-intermediate.badssl.com");    }    private void executeRequestAndVerifyStatusIsOk(String url) throws IOException {        HttpUriRequest request = new HttpGet(url);        HttpResponse response = httpClient.execute(request);        int statusCode = response.getStatusLine().getStatusCode();        assert statusCode == 200;    }}