Comment capturer https avec un violon, en Java

Je lance le programme Java suivant dans l’IDE Eclipse:

import java.net.*; import java.io.*; public class HH { public static void main(Ssortingng[] 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(); } } 

Cela produit l’exception suivante, si le violon est en cours d’exécution, à la fois lors de la capture et de la non 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 certificateion 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 le violon, le programme fonctionne sans aucune exception, produisant le code HTML sur l’URL auquel je me connecte.

alternativement, si je spécifie System.setProperty("https.proxyPort", "443"); , au lieu de: System.setProperty("https.proxyPort", "8888"); , il s’exécute et imprime tous les fichiers HTML, sans exception, même lorsque le violon est ouvert, en mode capture, mais il n’y a toujours pas de capture du tout sur le fiddler.

Ensuite, si je mets ces propriétés système dans les arguments jvm d’eclipse comme: -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 , la même exception exacte se produit à nouveau, tant que l’application est en cours d’exécution, tant en capture qu’en non capture mode. Si je ferme le violon, le programme fonctionnera parfaitement.

Si j’utilise: System.setProperty("http.proxyHost", "127.0.0.1"); au lieu de: System.setProperty("http.proxyHost", "localhost"); , il fonctionne bien avec l’application de fiddler en cours d’exécution, à la fois en mode cap / non capture, mais aussi pas de trafic capturé.

Est-ce que quelqu’un est capable de capturer son propre trafic https avec fiddler, PAS via un navigateur Web, mais via un programme Java? Quels sont les arguments de jvm, comment le configurez-vous pour cela? Merci

Créez un magasin de clés contenant le certificate Fiddler. Utilisez ce fichier de clés comme fichier de clés certifiées pour la machine virtuelle Java avec les parameters de proxy.

Voici comment procéder:

  • Exporter le certificate racine du violoniste

Tools -> Fiddler Options … -> HTTPS -> Exporter le certificate racine vers le bureau

  • Créer un magasin de clés avec ce certificate

Ouvrir la ligne de commande en tant qu’administrateur (keytool ne fonctionne pas autrement)

\ bin \ keytool.exe -import -file C: \ Users \ \ 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, démarrez la machine virtuelle Java avec Fiddler comme proxy et ce magasin de clés comme fichier de clés certifiées. Vous aurez besoin de ces vmargs:

-DproxySet = true

-DproxyHost = 127.0.0.1

-DproxyPort = 8888

-Djavax.net.ssl.trustStore =

-Djavax.net.ssl.trustStorePassword =

Utilisez ces vmargs dans votre configuration d’éclipse et vous devriez être prêt à partir.

Je suis capable de capturer les requêtes HTTPS effectuées depuis la JVM sans aucun problème avec cette configuration.

Créez un fichier de clés contenant le certificate du violoniste 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= -Djavax.net.ssl.trustStorePassword= -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); 

J’ai trouvé que j’avais aussi besoin des options de ligne de commande Java suivantes

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

Vous pouvez également importer une clé de violoniste dans le magasin de certificates approuvés Java:

  1. Exporter le certificate racine du violoniste

    Outils -> Options du violon … -> HTTPS -> Actions -> Exporter le certificate racine sur le bureau

  2. Exécuter en tant qu’administrateur:

“keytool.exe” -import -noprompt -trustcacerts -alias FiddlerRoot -fichier c: \ work \ FiddlerRoot.cer -keystore “C: \ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security \ cacerts” -storepass changes le

J’ai également eu un problème avec le déchiffrement du trafic https de Google API Client avec Fiddler. Le problème était que, par défaut, il utilise son propre magasin de certificates:

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

Et voici comment j’ai corrigé ceci:

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