44 votes

Ignorer le certificat SSL dans Apache HttpClient 4.3

Comment ignorer certificat SSL (de confiance) pour Apache HttpClient 4.3?

Toutes les réponses que j'ai trouvé sur AFIN de traiter les versions précédentes, et l'API a changé.

Connexes:

Edit:

  • C'est seulement à des fins de test. Les enfants, ne pas essayer à la maison (ou en cours de production)

60voto

mavroprovato Points 2278

Le code ci-dessous fonctionne pour avoir la confiance des certificats auto-signés. Vous devez utiliser le TrustSelfSignedStrategy lors de la création de votre client:

    SSLContextBuilder builder = new SSLContextBuilder();
    builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
            builder.build());
    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
            sslsf).build();

    HttpGet httpGet = new HttpGet("https://some-server");
    CloseableHttpResponse response = httpclient.execute(httpGet);
    try {
        System.out.println(response.getStatusLine());
        HttpEntity entity = response.getEntity();
        EntityUtils.consume(entity);
    }
    finally {
        response.close();
    }

Je n'ai pas l' SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER le but: Le but était de permettre de tester avec les certificats auto-signés et ne pas avoir à acquérir un bon certificat auprès d'une autorité de certification. Vous pouvez facilement créer un certificat auto-signé, avec le nom d'hôte correct, alors le faire à la place de l'ajout de l' SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER drapeau.

45voto

vasekt Points 342

Si vous utilisez la procédure PoolingHttpClientConnectionManager ci-dessus ne fonctionne pas, SSLContext personnalisé est ignoré. Lors de la création de PoolingHttpClientConnectionManager, vous devez passer socketFactoryRegistry dans le gestionnaire.

 SSLContextBuilder builder = SSLContexts.custom();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        return true;
    }
});
SSLContext sslContext = builder.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslContext, new X509HostnameVerifier() {
            @Override
            public void verify(String host, SSLSocket ssl)
                    throws IOException {
            }

            @Override
            public void verify(String host, X509Certificate cert)
                    throws SSLException {
            }

            @Override
            public void verify(String host, String[] cns,
                    String[] subjectAlts) throws SSLException {
            }

            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
        .<ConnectionSocketFactory> create().register("https", sslsf)
        .build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
        socketFactoryRegistry);
CloseableHttpClient httpclient = HttpClients.custom()
        .setConnectionManager(cm).build();
 

11voto

eis Points 14687

En complément de la réponse de @mavroprovato, si vous voulez faire confiance à tous les certificats au lieu de vous auto-signer, vous feriez

 builder.loadTrustMaterial(null, new TrustStrategy(){
    public boolean isTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        return true;
    }
});
 

Avertissement obligatoire: vous ne devriez pas vraiment faire cela, faire confiance à tous les certificats est une mauvaise chose. Cependant, il existe de rares cas d'utilisation pour lesquels vous souhaitez procéder.

Comme note au code donné précédemment, vous voudrez fermer la réponse même si httpclient.execute () lève une exception

 CloseableHttpResponse response = null;
try {
    response = httpclient.execute(httpGet);
    System.out.println(response.getStatusLine());
    HttpEntity entity = response.getEntity();
    EntityUtils.consume(entity);
}
finally {
    if (response != null) {
        response.close();
    }
}
 

11voto

migo Points 51

Un petit ajout à la réponse de vasekt:

La solution fournie avec SocketFactoryRegistry fonctionne avec PoolingHttpClientConnectionManager.

Cependant, les connexions via http ne fonctionnent plus. Vous devez également ajouter un PlainConnectionSocketFactory pour le protocole http pour que ceux-ci fonctionnent à nouveau:

 Registry<ConnectionSocketFactory> socketFactoryRegistry = 
  RegistryBuilder.<ConnectionSocketFactory> create()
  .register("https", sslsf)
  .register("http", new PlainConnectionSocketFactory()).build();
 

6voto

Saurabh Points 911

Après avoir essayé diverses options, la configuration suivante a fonctionné pour http et https

         SSLContextBuilder builder = new SSLContextBuilder();
        builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());


        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", new PlainConnectionSocketFactory())
                .register("https", sslsf)
                .build();


        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
        cm.setMaxTotal(2000);//max connection


        //System.setProperty("jsse.enableSNIExtension", "false"); //""
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .setConnectionManager(cm)
                .build();
 

J'utilise http-client 4.3.3 -

compile 'org.apache.httpcomponents:httpclient:4.3.3'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: