java eclipse https fiddler

cómo capturar https con el violinista, en java



eclipse fiddler (4)

Crea 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.

He aquí cómo hacerlo:

  • Exportar certificado raíz de Fiddler

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

  • Crear un almacén de claves con este certificado

Abra la línea de comando como administrador (la herramienta de claves no funciona de otro modo)

<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. Necesitarás estos vmargs:

-DproxySet = true

-DproxyHost = 127.0.0.1

-DproxyPort = 8888

-Djavax.net.ssl.trustStore = <ruta de acceso / a / FiddlerKeystore>

-Djavax.net.ssl.trustStorePassword = <Contraseña de Keystore>

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

Puedo capturar solicitudes HTTPS hechas desde la JVM sin ningún problema con esta configuración.

Estoy ejecutando el siguiente programa de Java en el IDE de Eclipse:

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 EJECUCIÓN, tanto al capturar como al no capturar:

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 violín, el programa funciona bien sin excepciones, produciendo el html en la url con la que me estoy conectando.

alternativamente, si especifico System.setProperty("https.proxyPort", "443"); , en lugar de: System.setProperty("https.proxyPort", "8888"); , ejecuta e imprime todo html, sin excepciones, incluso cuando el violín está abierto, en modo de captura, pero todavía no hay captura de ningún tipo de violín.

Entonces, si configuro 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 la captura como en la no captura modo. 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 ejecución de la aplicación fiddler, tanto el modo cap / / capturing como el tráfico NO capturado.

¿Hay alguien ahí fuera, 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


Cree un almacén de claves que contenga el certificado de violinista y úselo:

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 usa bibliotecas HTTP de terceros, debe establecer los proxies de conexión. Ejemplo con Apache Commons HttpClient:

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


Descubrí que también necesitaba las siguientes opciones de línea de comandos de Java

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


También puede importar clave fiddler en el almacén de certificados de confianza java:

  1. Exportar certificado raíz de Fiddler

    Herramientas -> Opciones de Fiddler ... -> HTTPS -> Acciones -> Exportar certificado de 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 cambialo

También tuve un problema al descifrar el tráfico https de Google API Client con Fiddler. El problema es que, de forma predeterminada, usa su propia tienda de certificados:

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

Y así es como arreglé esto:

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