57 votes

comment capturer https avec fiddler, en java

Je suis en cours d'exécution java suivantes dans le programme de l'IDE 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();
          }



        }

Ce produit est le suivant exception, si fiddler est en cours d'EXÉCUTION, à la fois lors de la capture, et pas de capture:

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 je ferme les violoneux, le programme fonctionne très bien sans aucune exception, de produire le code html sur l'url que je me connecte.

sinon, si je spécifie System.setProperty("https.proxyPort", "443");, au lieu de: System.setProperty("https.proxyPort", "8888");, il s'exécute et affiche tout le code html, sans exceptions, même si fiddler est ouvert, dans le mode de capture, mais il n'y a pas encore de capture de fiddler à tous.

Alors si j'ai mis ces propriétés système par le biais de l'éclipse de la jvm arguments comme: -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888,, exactement la même exception se produit à nouveau, aussi longtemps que le violoneux application est en cours d'exécution, à la fois dans la saisie et non en mode de capture. Si je ferme les violoneux, le programme fonctionne parfaitement bien.

Si j'utilise: System.setProperty("http.proxyHost", "127.0.0.1"); au lieu de: System.setProperty("http.proxyHost", "localhost");, il fonctionne très bien avec un violon application en cours d'exécution, les cap-/non mode de capture, mais aussi PAS capturé de la circulation.

Est ce que quelqu'un là-bas, en mesure de capturer leur propre trafic https avec un violon, et non PAS par le biais d'un navigateur web, mais par le biais d'un programme java? Quels sont les arguments jvm, comment peut-on mettre en place pour ce faire? merci

106voto

CodeMangler Points 701

Créer un fichier de clés contenant le Fiddler certificat. Utilisez ce fichier de clés que le truststore pour la JVM avec les paramètres de proxy.

Voici comment faire:

  • L'exportation de Violoniste certificat racine

Outils -> Fiddler Options... -> HTTPS -> Exporter le Certificat Racine de Bureau

  • Créer un fichier de clés avec ce certificat

Ouvrez la ligne de commande en tant qu'administrateur (keytool ne fonctionne pas autrement)

<JDK_Home>\bin\keytool.exe -importation de fichier C:\Users\<nom d'utilisateur>\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler

Entrez un mot de passe lorsque vous y êtes invité. Cela devrait créer un fichier appelé FiddlerKeystore.

  • Maintenant, lancez la JVM avec un violon que le proxy et ce keystore comme le truststore. Vous aurez besoin de ces vmargs:

-DproxySet=true

-DproxyHost=127.0.0.1

-DproxyPort=8888

-Djavax.net.le protocole ssl.trustStore=<chemin\vers\FiddlerKeystore>

-Djavax.net.le protocole ssl.trustStorePassword=<Mot de passe du fichier de clés>

L'utilisation de ces vmargs dans votre eclipse configuration d'exécution et vous devriez être bon d'aller.

Je suis en mesure de capturer les requêtes HTTPS fabriqué à partir de la JVM sans problèmes avec cette configuration.

6voto

Dimmduh Points 87

Créez un magasin de clés contenant le certificat du violoneux et utilisez-le:

 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 vous utilisez des bibliothèques HTTP tierces, vous devez définir les proxys de connexion. Exemple avec Apache Commons HttpClient:

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

2voto

Brook Points 21

J'ai constaté que j'avais également besoin des options de ligne de commande java suivantes

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X