Ignorer les certificats auto-signés dans Apache HTTPClient 4.5

Je suis en train de accepter tous les certificats et/ou d'accepter des certificats auto-signés à l'aide de Apache HTTPClient version 4.5 (tutoriel lien ici)

J'ai été en passant par des solutions à ce problème à partir d'un tas de posts sur. Pour l'instant aucun d'entre eux ont travaillé.

Je reçois cette erreur: Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Apache Docs:

Liées StackOverflow Questions - Voici quelques liens des solutions que j'ai essayé:

Noter que dans tous ces exemples, je suis également le passage d'un cookie magasin et un proxy informations d'identification fournisseur que j'ai défini plus haut. Ce sont de travail, je suis juste essayer d'ajouter le support de SSL.

Essayer #1

Créer mon propre ssl contexte avec SSLContextBuilder et de faire confiance à tous les auto-signé stratégies avec TrustSelfSignedStrategy.

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

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .build();

RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Essayer #2

Même que ci-dessus, mais ajouter un PoolingHttpClientConnectionManager

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", new PlainConnectionSocketFactory())
        .register("https", sslsf)
        .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(2000);//max connection

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .setConnectionManager(cm)
    .build();

RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Essayer #3

Simplement accepter TOUS les certificats en remplaçant la TrustStrategy (ce n'est pas recommandé)

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return true;
    }
});
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslsf)
    .build();

RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Essayer #4

J'ai trouvé quelque chose d'utile à partir de cette réponse:

À partir de la version 4.5 HttpClient désactive le protocole SSLv3 version par
par défaut

Voici la solution qu'il a donné:

SSLContext sslcontext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
        sslcontext, new String[] { "TLSv1", "SSLv3" }, null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());

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

httpclient = HttpClients.custom()
    .setDefaultCredentialsProvider(credsProvider)
    .setDefaultCookieStore(cookieStore)
    .setSSLSocketFactory(sslConnectionSocketFactory)
    .setConnectionManager(cm)
    .build();

RÉSULTAT: N'a pas fonctionné. Obtenu Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

OriginalL'auteur Katie S | 2016-10-07