Error del apretón de manos del emulador http-proxy SSL de Android

Tengo un proxy HTTP local configurado para la depuración de solicitudes .json y datos de respuesta de mi aplicación de Android. Lo implemento en una imagen de emulador de Nexus One con Android 4.2.2 con la opción de línea de comandos -http-proxy http://localhost:8888 . Estoy usando una acción ADT Construir: v21.1.0-569685. Puedo validar que el proxy HTTP puede manejar conexiones HTTPS con el siguiente fragmento de código que ejecuto usando groovy:

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

Este fragmento busca el recurso HTTPS bien, registra la solicitud y la respuesta sin cifrar y funciona maravillosamente. El proxy también funciona cuando se accede a recursos HTTPS desde un navegador configurado para usarlo como su proxy, así que estoy bastante seguro de que el problema no está en el proxy. Sobre la base del certificado, puede decir que estoy usando el mitmproxy, pero este código también funciona con el proxy ZAP de OWASP. Pero con cualquiera de los proxy, después de instalar el certificado raíz de la CA correspondiente en la imagen de Android, las solicitudes de HTTPS de la imagen fallan con los siguientes sucesos que se registran en el registro de sucesos de 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 

En el lado de Android, se produce la siguiente excepción:

 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 

Otras solicitudes HTTP se registran y se registran como se esperaba. ¿Qué es lo que me falta en la configuración de SSL para la imagen de Android para completar el apretón de manos SSL con el proxy HTTP con éxito?

Android Developers ofrece dos métodos para proporcionar proxy; El que utilizó y un método de variable de entorno. Tal vez pruebe el env var y ver si funciona?

Desde la página de desarrolladores de Android:

Si no se proporciona el comando -http-proxy, el emulador busca la variable de entorno http_proxy

Encontré los detalles en la página de desarrolladores de Android .

Es posible que esté utilizando la biblioteca que no admite la solicitud https.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.