Tengo problemas con la obtención de Android para conectarse a un servidor simple OpenSSL
utilizando el objeto HttpsUrlConnection
(he peinado a través Stackoverflow y una un montón de tutoriales en línea, y seguí los ejemplos más o menos línea por línea y todavía no puedo entender por qué el mío está roto cuando uso mi almacén de confianza local).Android HttpsURLConnection javax.net.ssl.SSLException Conexión cerrada por error pares apretón de manos cuando se utiliza almacén de confianza local de
Actualmente tengo una actividad Android que intenta conectarse a un simple OpenSSL server
(puedo conectar con el servidor usando un cliente de OpenSSL), una vez que el HttpsUrlConnection.connect()
se llama recibo una "javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake.
Tal vez yo soy la creación de mi servidor muestra de forma incorrecta ?
a tener en cuenta:
- sin autorización del cliente en el momento
- soy capaz de conectarse a https://www.google.com al cargar almacén de confianza predeterminado
- no soy capaz de conectar con el servidor en el servidor local con el certificado autofirmado
- no quieren confiar en todos los certificados
- no quieren utilizar Apache HttpClient
- quieren usar almacén de confianza local solamente
- creados locales almacén de confianza con castillo hinchable
- soy capaz de cargar correctamente almacén de confianza en
- detrás de un firewall proxy, proxy está configurado en mi dispositivo virtual Android
- AVD establece en
Android 4.1 API 16
.
cosas que ya he intentado:
- que conecta a ambos
127.0.0.1 and 10.0.2.2
- usando un nuevo
SecureRandom() with the SSLContext.init()
- crear la URL con
'URL u = new URL("https", "10.0.2.2", 443, "/");'
- usando
TrustManagerFactory.getDefaultAlgorithms()
en lugar de la "X 509"- da
"Unexpected response code error 503"
lugar de "Conexión cerrada por el par"
- da
Gracias de antemano por tomarse el tiempo para revisar mi pregunta!
servidor simple comenzó con el comando:
$ sudo openssl s_server -accept 443 -cert server-cert.pem -key server-key.pem -pass file:passphrase.txt -state -www -verify 0
la conexión del cliente probado con el comando:
$ openssl s_client -connect 127.0.0.1:443
código de actividad Android (editado para eliminar el código de ejecución completa de simplificación - por favor, hágamelo saber si hay más código es necesario) - la salida de error está debajo del código.
try {
TrustManagerFactory tmf;
// local trust store
tmf = TrustManagerFactory.getInstance("X509");
tmf.init(loadLocalKeyStore(getApplicationContext()));
// default trust store - works for https://www.google.com
// tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// tmf.init((KeyStore) null);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.STRICT_HOSTNAME_VERIFIER;
URL u = new URL("https://10.0.2.2");
HttpsURLConnection urlConnection = (HttpsURLConnection) u.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
urlConnection.setHostnameVerifier(hostnameVerifier);
urlConnection.connect();
System.out.println("Response Code: " + urlConnection.getResponseCode());
System.out.println("Response Code: " + urlConnection.getCipherSuite());
}
...
private KeyStore loadLocalKeyStore(Context context) {
InputStream in = context.getResources().openRawResource(R.raw.newserverkeystore);
KeyStore trusted = null;
try {
trusted = KeyStore.getInstance("BKS");
trusted.load(in, "thisisasecret".toCharArray());
} finally {
in.close();
}
return trusted;
}
de salida cuando se conecta correctamente a https://www.google.com:
09-09 21:58:09.947: I/System.out(669): Response Code: 200
09-09 21:58:09.947: I/System.out(669): Response Code: TLS_ECDHE_RSA_WITH_RC4_128_SHA
salida al intentar conectar con el servidor con el certificado autofirmado:
09-09 22:03:23.377: D/HttpsProxy(717): Https Request error
09-09 22:03:23.377: D/HttpsProxy(717): javax.net.ssl.SSLException: Connection closed by peer
09-09 22:03:23.377: D/HttpsProxy(717): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
09-09 22:03:23.377: D/HttpsProxy(717): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:442)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
09-09 22:03:23.377: D/HttpsProxy(717): at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)
09-09 22:03:23.377: D/HttpsProxy(717): at com.example.myfirstapp.HttpsUrlConnectionActivity$3.doInBackground(HttpsUrlConnectionActivity.java:257)
09-09 22:03:23.377: D/HttpsProxy(717): at com.example.myfirstapp.HttpsUrlConnectionActivity$3.doInBackground(HttpsUrlConnectionActivity.java:1)
09-09 22:03:23.377: D/HttpsProxy(717): at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-09 22:03:23.377: D/HttpsProxy(717): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-09 22:03:23.377: D/HttpsProxy(717): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-09 22:03:23.377: D/HttpsProxy(717): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-09 22:03:23.377: D/HttpsProxy(717): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-09 22:03:23.377: D/HttpsProxy(717): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-09 22:03:23.377: D/HttpsProxy(717): at java.lang.Thread.run(Thread.java:856)
Gracias de nuevo !!
Olvidé mencionar que no veo ninguna actividad del servidor cuando intento conectarme con el emulador de Android, solo con mi cliente OpenSSL. – aspergillusOryzae
muy difícil de formatear esta pregunta ;-) –
Disculpa, ¿hay alguna manera de que pueda hacerlo más fácil de entender antes de votar la pregunta? Estaba intentando explicar los métodos que había tomado de otras publicaciones antes de que me redirigieran a ellos. – aspergillusOryzae