2013-04-16 4 views
1

I mis en place Fiddler2 pour émulateur Android, cela fonctionne, je peux voir le trafic HTTPS via le navigateur Android, mais je ne peux pas se connecter au serveur HTTPS avec mon code à l'aide HttpsURLConnection:Android HttpURLConnection avec Fiddler: IOException: socket est fermée

// use Fiddler's proxy: 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("172.16.4.20", 8888)); 
    HttpsURLConnection connection = (HttpsURLConnection) new URL(url) 
      .openConnection(proxy); 

    connection.setRequestMethod(method); 
    connection.setRequestProperty("Content-Type", contentType); 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    OutputStream out = connection.getOutputStream(); 

Je suis:

java.net.SocketException: Socket is closed 

en Fiddler je peux voir la première demande (j'ai enlevé l'adresse hôte)

CONNECT [address]:443 HTTP/1.1 
Host: [address] 
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.0.4; Android SDK built for x86 Build/IMM76D) 
Connection: Keep-Alive 

After the client received notice of the established CONNECT, it failed to send any data. 

Réponse:

HTTP/1.1 200 Connection Established 
FiddlerGateway: Direct 
StartTime: 12:32:18.567 
Connection: close 

La paire de réponse à la demande ci-dessus est comme tout autre établissement de la connexion HTTPS du navigateur Android. Après cela, je ne peux pas envoyer ma demande POST (parce que j'ai reçu l'exception SocketException). Sans proxy cela fonctionne.

Répondre

0

L'explication la plus probable est que le client ferme la connexion car il n'est pas satisfait du certificat de déchiffrement HTTPS de Fiddler. Avez-vous configuré le périphérique pour approuver le fichier de certificat FiddlerRoot.cer? Avez-vous attaché un gestionnaire d'événement à votre HttpsURLConnection pour accepter le certificat auto-signé de Fiddler?

+0

Oui, j'ai ajouté FiddlerRoot.cer et je fais confiance dans tous les certificats. Comme je l'ai dit dans le navigateur Android tout va bien avec les sites HTTPS, et je peux voir le trafic de Fiddler. –

+2

Cela suggère que les applications n'héritent pas de l'approbation de certificat du navigateur. Avez-vous attaché un gestionnaire d'événement à votre HttpsURLConnection pour accepter le certificat auto-signé de Fiddler? – EricLaw

+0

Je suis tombé sur le même problème. J'ai installé FiddlerRoot.cer sur mon appareil, comme Attila a déclaré que je peux renifler le trafic https à partir du navigateur Android et Chrome. Que voulez-vous dire "attaché un gestionnaire d'événements à votre HttpsURLConnection pour accepter le certificat auto-signé de Fillder"? J'ai implémenté un TrustManager factice qui ne fait rien et l'utilise comme une partie de SSLSocketFactory. Mais ça ne marche pas. Je reçois toujours SocketException disant "socket est fermé" –

0

Je faisais face au même problème sur mon iPhone.
Ce que je ne visitais cette URL
ht_tp (enlever le score sous): // (replace_with_the_ip_of_the_host_where_fiddler_is_running): 8888
à partir de votre appareil mobile (dans votre cas votre appareil Android émulé) Et alors vous être affiché comme une page Web décrit sur ce lien click this
Vous devez installer le certificat. Après cela, vous serez affiché avec la réponse dans fiddler.

Profitez-en!

+0

Cela ne fonctionne pas à partir de l'application, qui aidera seulement à capturer le trafic du navigateur –

+0

Il travaille pour moi au moins à partir de périphérique physique avec le proxy Http mis en place correctement. – TypingPanda

0

La raison peut être que l'application utilise l'épinglage des certificats. Au lieu de faire confiance à un certificat dans le "Trust Store" du périphérique, il est configuré pour approuver uniquement un certificat spécifique (signé par le serveur). Par conséquent, lorsque Fiddler présente son propre certificat, le client génère une erreur.

Plus de détails: https://security.stackexchange.com/questions/29988/what-is-certificate-pinning

Questions connexes