comment capturer https avec fiddler, en java
j'exécute le programme java suivant dans 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();
}
}
ceci produit l'exception suivante, si fiddler est en cours d'exécution, à la fois lors de la capture, et non de la 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 fiddler, le programme fonctionne bien sans aucune exception, produisant le html sur l'url à laquelle je me connecte.
sinon, si je spécifie System.setProperty("https.proxyPort", "443");
, au lieu de: System.setProperty("https.proxyPort", "8888");
, il exécute et imprime tout html, sans exception, même si fiddler est ouvert, en mode capture, mais il n'y a toujours pas de capture de fiddler du tout.
alors si je mets ces propriétés du système à travers 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 fiddler est en cours d'exécution, tant en mode Capture qu'en mode non capture. Si je ferme fiddler, 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 très bien avec l'application fiddler en cours d'exécution, les deux mode cap-/non capturing, mais aussi PAS capturé de la circulation.
est-ce que quelqu'un est capable de capturer son propre trafic https avec fiddler, pas par le biais d'un navigateur web, mais par le biais d'un programme java? Quels sont les arguments de la jvm, comment l'organisez-vous? merci
4 réponses
créer un keystore contenant le certificat Fiddler. Utilisez ce keystore comme truststore pour la JVM avec les paramètres proxy.
Voici comment faire:
- exporter le certificat racine de Fiddler
Outils -> Fiddler Options... - >HTTPS - > exporter le certificat Root vers le bureau
- Créer un fichier de clés avec ce certificat
ouvrir la ligne de commande en tant qu'administrateur (keytool ne fonctionne pas sinon)
\bin\keytool.exe-import-file C:\Users\ \Desktop\FiddlerRoot.cer-keystore FiddlerKeystore-alias Fiddler
saisissez un mot de passe lorsqu'on vous le demande. Cela devrait créer un fichier appelé FiddlerKeystore.
- maintenant, démarrez la JVM avec Fiddler comme mandataire et ce keystore comme truststore. Vous aurez besoin de ces vmargs:
- DproxySet=true
- DproxyHost=127.0.0.1
- DproxyPort=8888
- Djavax.net.ssl.trustststore= < path\to\FiddlerKeystore>
- Djavax.net.ssl.trustststorepassword= < Keystore Password>
utilisez ces vmargs dans votre configuration d'exécution eclipse et vous devriez être prêt à y aller.
je suis capable de capturer les requêtes HTTPS faites depuis la JVM sans aucun problème avec cette configuration.
Créer un fichier de clés contenant le violoneux de certificat et de l'utiliser:
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 mandataires 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 la clé fiddler dans la boutique de certificats java trusted:
exporter le certificat racine de Fiddler
Outils -> Fiddler Options... - >HTTPS - > Actions - > exporter le certificat Root vers le bureau
Exécuter en tant qu'admin:
"keytool.exe " - import-noprompt -trustcacerts-alias FiddlerRoot -file c:\work\FiddlerRoot.cer-keystore "C:\Program fichiers\Java\jdk1.7.0_79\jre\lib\security \ cacerts" - storepass changeit!--3-->
J'ai aussi eu un problème avec le décryptage du trafic https du Client API Google avec Fiddler. Le problème est que par défaut, il utilise son propre cert store:
InputStream keyStoreStream = GoogleUtils.class.getResourceAsStream("google.jks");
SecurityUtils.loadKeyStore(certTrustStore, keyStoreStream, "notasecret");
Et voilà comment j'ai résolu ce:
HttpTransport transport = new NetHttpTransport()
//istead of transport = GoogleNetHttpTransport.newTrustedTransport();