2011-10-07 20 views
7

Estoy intentando que la biblioteca HttpClient de Apache Commons (versión 3.1) ignore el hecho de que el certificado del servidor no puede establecerse como de confianza (como lo demuestra la excepción lanzada javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target).Cómo hacer que Apache Commons HttpClient 3.1 ignore la invalidez del certificado HTTPS?

encontré Make a connection to a HTTPS server from Java and ignore the validity of the security certificate, así como Disable Certificate Validation in Java SSL Connections, pero la respuesta aceptada a la primera es para HttpClient 4.0 (por desgracia no puedo actualizar, menos alguien me puede apuntar en la dirección de cómo utilizar dos versiones diferentes de la misma biblioteca dentro del mismo proyecto), aunque tiene another answer with little more than a dead link that supposedly went to a 3.x solution. El código en la segunda página parece no tener ningún efecto cuando utilizo una versión ligeramente ajustada de él (básicamente, declaro las clases a la antigua en lugar de usar las anónimas en línea, así como aplicar a TLS además de SSL, utilizando SSL para la fábrica de socket HTTPS predeterminada como se hace en el código de ejemplo).

Preferiblemente, me gustaría algo que es thread-/de nivel de instancia, por lo que cualquier HttpClient instancia (y/o clases relacionadas) ser creado desde dentro de mi código servlet (no otro servlet se ejecuta en el mismo contenedor) utilizará la lógica de validación de certificado laxa, pero en este momento estoy empezando a sentir que todo va a hacer mientras acepte el certificado autofirmado como válido.

Sí, soy consciente de que existen implicaciones de seguridad, pero la única razón por la que necesito esto es para realizar pruebas. La idea es implementar una opción de configuración que controle si los certificados que normalmente no son de confianza son confiables o no, y déjelos en "no confiar en certificados de servidor no confiables" como predeterminado. De esta forma, puede activarse o desactivarse fácilmente durante el desarrollo, pero hacerlo en producción requerirá que se salga de un camino.

Respuesta

11

Para aceptar certificados autofirmados, usamos el siguiente código para un cliente HttpConnection en particular del cliente http de commons.

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

El EasySSLProtocolSocketFactory se puede encontrar en el paquete de contribución SSL. Y esto se puede usar para hacer conexiones únicas con la configuración de seguridad reducida. Parece que esto también se puede utilizar para establecer el protocolo para cada cliente, como se muestra aquí:

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

Pero creo que también influirá en las conexiones de otros servlets.

[Editar] Lo siento, no sé si esto funcionará para usted. Acabo de reconocer que estamos utilizando el cliente 3.0.1 y no 3.1.

+0

Sí, 3.1 ha dejado de fabricar el protocolo que ejemplifica, y no tiene aparentemente ningún método HttpConnection # setProtocol. Lástima, parecía prometedor. :( –

+0

El constructor también está en desuso en 3.0.1;) Según el repositorio fuente de apache 'HttpConnection' todavía tiene un método' setProtocol' en 3.1: http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

La fábrica se puede convertir a 'ProtocolSocketFactory', que es solo un upcast y, por lo tanto, no es necesario si eliminan el constructor en desuso. , entonces usa el contructor no desaprobado ya, actualizaré mi publicación. – Gandalf

Cuestiones relacionadas