2013-05-23 11 views
13

Android uygulamamdan gelen hata ayıklama .json istek ve yanıt verileri için yerel bir HTTP proxy'si var. Bunu, komut satırı seçeneği -http-proxy http://localhost:8888 ile Android 4.2.2 çalıştıran bir Nexus One öykünücüsüne dağıtırım. Bir stok ADT Build kullanıyorum: v21.1.0-569685. Ben HTTP vekil ben harika kullanarak çalıştırmak aşağıdaki kod parçası ile HTTPS bağlantılarını işleyebilir doğrulayabilmeniz:Android emulator http-proxy SSL anlaşma hatası

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

Bu pasajı, sadece iyi HTTPS kaynak getirir istek ve şifresiz yanıtını kaydeder ve güzel çalışıyor. Proxy ayrıca, proxy olarak kullanmak üzere yapılandırılmış bir tarayıcıdan HTTPS kaynaklarına erişirken de çalışır, dolayısıyla sorunun proxy ile olmadığından eminim. Sertifikaya dayanarak, mitmproxy'yi kullandığımı söyleyebilirsin, ancak bu kod ayrıca OWASP ZAP proxy'si ile de çalışır. Android tarafında

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 

, şu istisna: Ama her iki proxy ile, Android görüntü üzerinde uygun CA kök sertifikası yükledikten sonra, HTTPS görüntüden istekleri aşağıdaki olaylar mitmproxy olay günlüğüne ediliyor ile başarısız atılır:

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 

Diğer HTTP istekleri beklendiği gibi günlüğe kaydedilir ve kaydedilir. SSL görüntülemesinin SSL proxy'sini HTTP proxy'si ile başarıyla tamamlaması için SSL kurulumunda neyi eksik duyuyorum?

+1

Yanıtı hiç buldunuz mu? Android 2.3.3'te aynı sorunu yaşıyorum. [Bu yöntemle] (http://varutra.com/blog/?p=69) tarafından öykünücünün görüntüsünü yükledim, ancak 400 hatası almaya devam ediyorum. – jab

cevap

-1

https isteğini desteklemeyen bir kütüphane kullanıyor olabilirsiniz.

0

Android Geliştiricileri, proxy sağlamak için iki yöntem sunar; Kullandığınız ve bir ortam değişkeni yöntemi. Belki env var denemek ve çalışıp çalışmadığını görmek? Android Geliştiricileri sayfasından

:

-http-vekil komutu verilir değilse, emülatör

değişken Ben Android Developers page ilgili ayrıntıları bulundu http_proxy ortamını arar.