2011-12-18 31 views
39

Estoy funcionando el siguiente programa Java en el IDE Eclipse:cómo capturar https con el violinista, en Java

import java.net.*; 
import java.io.*; 

public class HH 
{ 
    public static void main(String[] args)throws Exception 
    { 
     //if i comment out the system properties, and don't set any jvm arguments, the program runs and prints out the html fine. 
      System.setProperty("http.proxyHost", "localhost"); 
      System.setProperty("http.proxyPort", "8888"); 
      System.setProperty("https.proxyHost", "localhost"); 
      System.setProperty("https.proxyPort", "8888"); 

      URL x=new URL("https://www.google.com"); 
      HttpURLConnection hc=(HttpURLConnection)x.openConnection(); 

      hc.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.0) 
      AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"); 


      InputStream is=hc.getInputStream(); 

      int u=0; 
      byte[] kj=new byte[1024]; 
      while((u=is.read(kj))!=-1) 
      { 
       System.out.write(kj,0,u); 
      } 
      is.close(); 
      } 



     } 

Esto produce la siguiente excepción, si el violinista está en marcha, tanto durante la captura, y no la captura:

Exception in thread "main" 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 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown ... 

Si cierro el violinista, el programa funciona muy bien y sin ninguna excepción, produciendo el html en la url que estoy conectando.

alternativamente, si especifico System.setProperty("https.proxyPort", "443");, en lugar de: System.setProperty("https.proxyPort", "8888");, se ejecuta e imprime todo el HTML, sin excepciones, incluso mientras el violinista está abierto, en el modo de captura, pero todavía no hay una captura de violinista en absoluto.

Luego, si establezco estas propiedades del sistema a través de los argumentos jvm de eclipse como: -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888, la misma excepción exacta ocurre nuevamente, siempre y cuando la aplicación fiddler se esté ejecutando, tanto en modo de captura como de no captura. Si cierro el violín, el programa funcionará perfectamente bien.

Si uso: System.setProperty("http.proxyHost", "127.0.0.1");, en lugar de: System.setProperty("http.proxyHost", "localhost");, funciona bien con la aplicación fiddler ejecutándose, tanto el modo de cap/no captura, como el tráfico NO capturado.

¿Hay alguien por ahí, capaz de capturar su propio tráfico https con el violín, NO a través de un navegador web, sino a través de un programa java? ¿Cuáles son los argumentos de jvm? ¿Cómo se configura para hacer esto? gracias

+1

no has conjunto proveedor de SSL, almacén de claves, almacén de confianza, etc – aishwarya

+0

cómo se puede hacer esto –

+0

revise esta guía: http: //codeketchup.blogspot.com/2014/03/how-to-use-eclipse-with-fiddler-step-by.html –

Respuesta

82

Cree un almacén de claves que contenga el certificado Fiddler. Utilice este almacén de claves como almacén de confianza para la JVM junto con la configuración del proxy.

Aquí es cómo hacerlo:

  • el certificado raíz de exportación violinista

Herramientas -> Opciones de Fiddler ... -> HTTPS -> Exportar certificado raíz de escritorio

  • Crear un almacén de claves con este certificado

línea de comando Abrir como administrador (herramienta de claves no funciona de otra manera)

< JDK_HOME> \ bin \ keytool.exe -import -file C: \ Users \ < nombre de usuario> \ Desktop \ FiddlerRoot. cer -keystore FiddlerKeystore -alias Fiddler

Ingrese una contraseña cuando se le solicite. Esto debería crear un archivo llamado FiddlerKeystore.

  • Ahora inicie la JVM con Fiddler como proxy y este almacén de claves como almacén de confianza.Tendrá que estos vmargs:

-DproxySet = true

-DproxyHost = 127.0.0.1

-DproxyPort = 8888

-Djavax.net.ssl.trustStore = < ruta \ a \ FiddlerKeystore>

-Djavax.net.ssl.trustStorePassword = < almacén de claves de contraseña>

Usa estos vmargs en la configuración de ejecución de tu eclipse y deberías estar listo para empezar.

Soy capaz de capturar las solicitudes HTTPS realizadas desde la JVM sin ningún problema con esta configuración.

+1

Funciona perfectamente para mí - muchas gracias – davidfrancis

+1

Es una gran ayuda !!! –

+1

Así es como lo hice. Muchas gracias :) http://techie-mixture.blogspot.com/2016/07/how-to-capture-https-traffic-with.html –

2

encontré que también requieren las siguientes opciones de línea de comandos java

-Dhttps.proxyPort=8888 
-Dhttps.proxyHost=127.0.0.1 
+0

Comencé con esos vmargs también, pero más tarde me di cuenta de que eran redundantes. es decir, podría capturar perfectamente sin ellos, y usar solo estos dos, en lugar de los argumentos proxyPort y proxyHost, no funcionaría. No estoy seguro de si depende de VM/ambiente. --EDIT-- Estaba capturando desde Oracle JDK 6 en Windows 7 por cierto. – CodeMangler

3

Crear un almacén de claves que contiene el certificado violinista y utilizarlo:

java -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 -Dhttps.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Djavax.net.ssl.trustStore=<path to FiddlerKeystore> -Djavax.net.ssl.trustStorePassword=<password> -jar test.jar 

Si se utilizan bibliotecas de terceros HTTP fiesta, necesidad de establecer los proxies de conexión. Ejemplo con Apache Commons HttpClient:

HttpClient httpClient = new HttpClient(); 
httpClient.getHostConfiguration().setProxy("localhost", 8888); 
1

También puede importar la clave violinista en Java sea de confianza almacenar certificados:

  1. el certificado raíz de exportación violinista

    Herramientas -> Opciones ... Fiddler -> HTTPS -> Acciones -> Exportar certificado raíz a escritorio

  2. Ejecutar como administrador:

"keytool.exe" -import -noprompt -trustcacerts -alias FiddlerRoot -file c: \ work \ FiddlerRoot.cer -keystore "C: \ Archivos de programa \ Java \ jdk1.7.0_79 \ jre \ lib \ security \ cacerts "-storepass changeit

También tuve un problema para descifrar el tráfico https de Google API Client con Fiddler. El problema era que por defecto usa su propia tienda cert:

InputStream keyStoreStream = GoogleUtils.class.getResourceAsStream("google.jks"); 
SecurityUtils.loadKeyStore(certTrustStore, keyStoreStream, "notasecret"); 

Y así es como me fijo esto:

HttpTransport transport = new NetHttpTransport() 
//istead of transport = GoogleNetHttpTransport.newTrustedTransport(); 
Cuestiones relacionadas