2013-05-23 26 views
13

Ho un proxy HTTP locale impostato per il debug dei dati di richiesta e risposta di json dalla mia applicazione Android. Lo distribuisco su un'immagine di emulatore Nexus One su cui è in esecuzione Android 4.2.2 con l'opzione da riga di comando -http-proxy http://localhost:8888. Sto usando una build ADT di serie: v21.1.0-569685. Posso confermare che il proxy HTTP in grado di gestire le connessioni HTTPS con il seguente frammento di codice ho eseguito usando Groovy:Errore di handshake SSL dell'emulatore Android http-proxy

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(); 
} 

Questo frammento recupera la risorsa HTTPS bene, registra la richiesta e la risposta in chiaro, e funziona a meraviglia. Il proxy funziona anche quando si accede alle risorse HTTPS da un browser configurato per utilizzarlo come proxy, quindi sono abbastanza sicuro che il problema non è con il proxy. Sulla base del certificato, puoi dire che sto usando il mitmproxy, ma questo codice funziona anche con il proxy ZAP OWASP. Ma sia con delega, dopo aver installato il certificato CA principale appropriata sull'immagine Android, HTTPS richieste da l'immagine non riescono con i seguenti eventi viene registrato nel registro eventi mitmproxy:

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 

Sul lato Android, la seguente eccezione viene lanciato:

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 

Altre richieste HTTP vengono registrate e registrate come previsto. Cosa mi manca nella configurazione SSL per l'immagine Android per completare con successo l'handshake SSL con il proxy HTTP?

+1

Hai mai trovato la risposta? Sto avendo lo stesso problema su Android 2.3.3. Ho installato il certificato nell'immagine dell'emulatore con [questo metodo] (http://varutra.com/blog/?p=69) ma continuo a ricevere l'errore 400. – jab

risposta

-1

È possibile che si stia utilizzando una libreria che non supporta la richiesta https.

0

Gli sviluppatori Android forniscono due metodi per la fornitura del proxy; quello che hai usato e un metodo di variabile d'ambiente. Forse prova l'env var e vedi se funziona?

Dalla pagina Sviluppatori Android:

Se il comando -http-proxy non è in dotazione, l'emulatore guarda la variabile d'ambiente http_proxy

ho trovato i dettagli sul Android Developers page.