¿Cómo ignorar el certificado SSL (confiar en todos) para Apache HttpClient 4.3 ?
Todas las respuestas que he encontrado en SO tratan versiones anteriores y la API cambió.
Relacionado:
- Cómo ignorar los errores del certificado SSL en Apache HttpClient 4.0
- ¿Cómo manejar certificados SSL no válidos con Apache HttpClient?
- Necesita confiar en todos los certificados durante el desarrollo usando Spring
- Ignorar errores de certificado SSL con Java
Editar:
- Es solo para fines de prueba. Niños, no lo prueben en casa (o en producción)
java
ssl
apache-httpcomponents
Jakub M.
fuente
fuente
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
Idea encuentra varias clases llamadas .Si está utilizando el procedimiento PoolingHttpClientConnectionManager anterior no funciona, se ignora el SSLContext personalizado. Debe pasar socketFactoryRegistry en contructor al crear PoolingHttpClientConnectionManager.
fuente
HttpClients.custom().setConnectionManager(cm).build()
yHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
funcionarán, por lo que no es necesario crear unaPoolingHttpClientConnectionManager
Como una adición a la respuesta de @mavroprovato, si desea confiar en todos los certificados en lugar de solo autofirmados, lo haría (en el estilo de su código)
o (copiar y pegar directamente desde mi propio código):
Y si también desea omitir la verificación del nombre de host, debe configurar
también. (ALLOW_ALL_HOSTNAME_VERIFIER está obsoleto).
Advertencia obligatoria: realmente no debería hacer esto, aceptar todos los certificados es algo malo. Sin embargo, hay algunos casos de uso poco comunes en los que desea hacer esto.
Como nota al código dado anteriormente, querrá cerrar la respuesta incluso si httpclient.execute () arroja una excepción
El código anterior se probó usando
Y para los interesados, aquí está mi conjunto de prueba completo:
(proyecto de prueba de trabajo en github )
fuente
Una pequeña adición a la respuesta de vasekt:
La solución proporcionada con SocketFactoryRegistry funciona cuando se usa PoolingHttpClientConnectionManager.
Sin embargo, las conexiones a través de http simple ya no funcionan. Debe agregar un PlainConnectionSocketFactory para el protocolo http adicionalmente para que funcionen nuevamente:
fuente
http
protocolo se usaPlainConnectionSocketFactory
de forma predeterminada. Solo me registréhttps
yhttpclient
todavía puedo obtener URL HTTP simples. por lo que no creo que este paso sea necesario.PoolingHttpClientConnectionManager
Después de probar varias opciones, la siguiente configuración funcionó tanto para http como para https
Estoy usando http-client 4.3.3 -
compile 'org.apache.httpcomponents:httpclient:4.3.3'
fuente
Código de trabajo más simple y corto:
fuente
Aquí hay una destilación de trabajo de las técnicas anteriores, equivalente a "curl --insecure":
fuente
Cuando usé el cliente http 4.5, tuve que usar javasx.net.ssl.HostnameVerifier para permitir cualquier nombre de host (con fines de prueba). Esto es lo que terminé haciendo:
fuente
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
conSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Evita la clase anónima y hace que el código sea un poco más legible.Además de
PoolingHttpClientConnectionManager
junto conRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Si desea un cliente http asincrónico que usePoolingNHttpClientConnectionManager
el código, debe ser similar a lo siguientefuente
Si está utilizando
HttpClient 4.5.x
, su código puede ser similar al siguiente:fuente
fuente
Confíe en todos los certificados en el cliente HTTP Apache
fuente
(Habría agregado un comentario directamente a la respuesta de vasekt pero no tengo suficientes puntos de reputación (no estoy seguro de la lógica)
De todos modos ... lo que quería decir es que incluso si no está creando / solicitando explícitamente una PoolingConnection, no significa que no esté obteniendo una.
Me estaba volviendo loco tratando de averiguar por qué la solución original no funcionó para mí, pero ignoré la respuesta de vasekt ya que "no se aplicaba a mi caso", ¡mal!
Estaba mirando mi rastro de pila cuando estaba bajo y he aquí que vi una PoolingConnection en el medio. Bang - ¡¡Me cansé de su adición y éxito !! (nuestra demostración es mañana y me estaba desesperando) :-)
fuente
Puede usar el siguiente fragmento de código para obtener la instancia de HttpClient sin la verificación de la certificación ssl.
fuente
Ligero ajuste para responder desde @divbyzero arriba para corregir las advertencias de seguridad de la sonda
fuente
Inicialmente, pude deshabilitar localhost usando una estrategia de confianza, luego agregué NoopHostnameVerifier. Ahora funcionará tanto para localhost como para cualquier nombre de máquina
fuente