Ignorar los certificados auto-firmados en Apache HTTPClient 4.5

Estoy tratando de aceptar todos los certificados y/o aceptar los certificados auto-firmados utilizando Apache HTTPClient versión 4.5 (enlace tutorial aquí)

He estado yendo a través de las soluciones a este problema a partir de un montón de posts en TAN. Hasta el momento ninguno de ellos han trabajado.

Me sale este error: Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Apache Docs:

Relacionados con la Pregunta de StackOverflow – he Aquí algunos enlaces de las soluciones que yo he probado:

Tenga en cuenta que en todos estos ejemplos también estoy pasando un almacén de cookies y un proxy credenciales del proveedor que he definido anteriormente. Estos están trabajando, sólo estoy tratando de agregar el soporte para SSL.

Probar #1

Crear mi propio ssl contexto con SSLContextBuilder y confiar en todas las autofirmado estrategias con 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();

RESULTADO: no funcionó. Tengo Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Probar #2

Igual que el anterior, pero se añade 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();

RESULTADO: no funcionó. Tengo Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Probar #3

Simplemente aceptar TODOS los certificados reemplazando el TrustStrategy (esto no es recomendable)

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();

RESULTADO: no funcionó. Tengo Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Probar #4

He encontrado algo útil de esta respuesta:

A partir de la versión 4.5 HttpClient desactiva el protocolo SSLv3 versión
por defecto

Aquí está la solución que dio:

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();

RESULTADO: no funcionó. Tengo Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

InformationsquelleAutor Katie | 2016-10-07

4 Kommentare

  1. 2

    Uno de los enfoques anteriores se debe trabajar en el caso de los certificados auto-firmados, pero lo extraño es que están recibiendo la misma excepción en todos los enfoques.

    Me sentiré durante la sesión SSL establecimiento o protocolo de comunicación no está siendo aceptado por el cliente o servidor.

    La mejor solución aquí es para depurar la aplicación.

    En el caso de tomcat, agregar -Djavax.net.debug=todos en setenv.sh o setenv.archivos bat y, a continuación, reinicie el servidor.

    O puede seguir este tutorial.

    El OP solo necesitaba cambiar el puerto al conectar con SSL:

    //For HTTPS
    HttpHost httpstarget = new HttpHost("mysite.com", 443, "https");
    
    //For HTTP
    HttpHost httptarget = new HttpHost("mysite.com", 80, "http");
    • Sí, tienes razón. Sólo traté de ir al sitio real y creo que es hacia abajo lol podrían haber estado trabajando todo este tiempo
  2. 7

    Puedo usar Apache HttpClient 4.5.3 y ninguna de las soluciones anteriores ayudado. Yo siempre tengo el error

    PKIX Ruta de la construcción de error

    .

    He encontrado la solución en http://www.baeldung.com/httpclient-ssl

    Aquí está mi código:

    try {
        SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(null, (certificate, authType) -> true).build();
        httpClient = HttpClients.custom().setSSLContext(sslContext)
                .setSSLHostnameVerifier(new NoopHostnameVerifier())
                .build();
    } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
        e.printStackTrace();
    }
  3. 5

    Muy a menudo no sólo se necesita el apoyo de auto certificados firmados, pero también invocar multi-threaded solicitudes, y a fin de utilizar una agrupación de administrador de conexión. He aquí cómo lo hago:

    private CloseableHttpClient newClient() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
        SSLContext context = SSLContexts.custom()
                .loadTrustMaterial(TrustSelfSignedStrategy.INSTANCE)
                .build();
    
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE))
                .build();
    
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    
        return HttpClients.custom()
                .setConnectionManager(connectionManager)
                .build();
    }
  4. 2
    public static HttpClient newClient() {
            SSLContext sslcontext = null;
            try {
                sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
            } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
                e.printStackTrace();
            }
    
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslcontext,
                    (s, sslSession) -> true);
    
            return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory)
                    .build();
        }
    • Agregar algunos comentarios y la descripción.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea