2013-05-23 9 views
13

Ich habe einen lokalen HTTP-Proxy für das Debuggen .json Anfrage und Antwortdaten von meiner Android-Anwendung eingerichtet. Ich stelle es auf einem Nexus One-Emulator-Image bereit, auf dem Android 4.2.2 mit der Befehlszeilenoption -http-proxy http://localhost:8888 ausgeführt wird. Ich verwende eine ADT Build-Version: v21.1.0-569685. Ich kann bestätigen, dass die HTTP-Proxy-HTTPS-Verbindungen mit dem folgenden Code-Schnipsel verarbeiten kann ich groovy laufe mit:Android Emulator http-Proxy SSL-Handshake-Fehler

import java.security.KeyStore; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateFactory; 

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManagerFactory; 

FileInputStream fis = 
    new FileInputStream("./.mitmproxy/mitmproxy-ca-cert.pem"); 
BufferedInputStream bis = new BufferedInputStream(fis); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(null,"".toCharArray()); 
while (bis.available() > 0) 
{ 
    Certificate cert = cf.generateCertificate(bis); 
    ks.setCertificateEntry("mitmproxy", cert); 
    System.out.println(cert.toString()); 
} 
TrustManagerFactory tmf = 
    TrustManagerFactory.getInstance(
     TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(ks); 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(null, tmf.getTrustManagers(), null); 
SSLSocketFactory sslFactory = ctx.getSocketFactory(); 
try 
{ 
    String url = "https://www.openssl.org/"; 
    Proxy proxy = 
     new Proxy(
      Proxy.Type.HTTP, 
      new InetSocketAddress("127.0.0.1", 8888)); 
    HttpsURLConnection conn = 
     (HttpsURLConnection) new URL(url).openConnection(proxy); 
    conn.setSSLSocketFactory(sslFactory); 
    String s = 
     new Scanner(
      conn.getInputStream(), 
      "UTF-8").useDelimiter("\\A").next(); 
    System.out.println(s); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

Dieser Code-Schnipsel holt die HTTPS-Ressource nur gut, protokolliert die Anfrage und Antwort unverschlüsselt, und funktioniert wunderbar. Der Proxy funktioniert auch beim Zugriff auf HTTPS-Ressourcen von einem Browser aus, der für die Verwendung als Proxy konfiguriert wurde. Daher bin ich mir ziemlich sicher, dass das Problem nicht beim Proxy liegt. Anhand des Zertifikats können Sie feststellen, dass ich den mitmproxy verwende, aber dieser Code funktioniert auch mit dem OWASP ZAP-Proxy. Aber mit jedem Proxy, nachdem er das entsprechende CA-Root-Zertifikat auf dem Android Image zu installieren, HTTPS-Anfragen aus dem Bild nicht mit folgenden Ereignissen in das mitmproxy Ereignisprotokoll protokolliert werden:

127.0.0.1:56210: connect 
127.0.0.1:56210: 400: SSL handshake error: (-1, 'Unexpected EOF') 
127.0.0.1:56210: disconnect 
    -> handled 0 requests 

Auf der Android Seite, die folgende Ausnahme wird ausgelöst:

05-23 16:13:30.109: E/HttpUrlConnectionClient(827): Network error 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x2a180890: Failure in SSL library, usually a protocol error 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:766 0x45dc2ba8:0x00000000) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:420) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:219) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:480) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:444) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:294) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:244) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:286) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:181) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.integralblue.httpresponsecache.compat.libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:273) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.network.HttpUrlConnectionClient.send(HttpUrlConnectionClient.java:178) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.network.AppClient.send(AppClient.java:212) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.network.MsiClient.send(MsiClient.java:87) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.services.SimpleService.runService(SimpleService.java:134) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.task.InitTask.doInBackground(InitTask.java:84) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at com.ehi.national.mobile.task.InitTask.doInBackground(InitTask.java:1) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at java.lang.Thread.run(Thread.java:856) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x2a180890: Failure in SSL library, usually a protocol error 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:766 0x45dc2ba8:0x00000000) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:378) 
05-23 16:13:30.109: E/HttpUrlConnectionClient(827):  ... 20 more 

Andere HTTP-Anforderungen werden wie erwartet protokolliert und aufgezeichnet. Was fehlt mir bei der SSL-Einrichtung für das Android-Image, um den SSL-Handshake mit dem HTTP-Proxy erfolgreich abzuschließen?

+1

Haben Sie jemals die Antwort gefunden? Ich habe das gleiche Problem auf Android 2.3.3. Ich habe das Zertifikat im Emulator-Image von [dieser Methode] installiert (http://varutra.com/blog/?p=69), behalte aber immer den 400-Fehler. – jab

Antwort

-1

Möglicherweise verwenden Sie eine Bibliothek, die https-Anfrage nicht unterstützt.

0

Android-Entwickler gibt zwei Methoden für die Bereitstellung von Proxy; die von Ihnen verwendete Methode und eine Umgebungsvariable. Vielleicht versuchen Sie die env var und sehen, ob es funktioniert?

Von der Android Developers Seite:

Wenn der -http-Proxy-Befehl nicht angegeben wird, sucht der Emulator bis fanden die http_proxy-Umgebungsvariable

ich die Details über die Android Developers page.