Crear SSL-Socket en Android con certificado autofirmado

Estoy intentando conectar una aplicación de Android a un servidor habilitado para SSL, que utiliza un certificado autofirmado. Ya he leído docenas de tutoriales y la aplicación está aceptando el certificado y conectándome al servidor, pero nunca obtengo ningún dato.

El código original que utilicé para inicializar el socket es el siguiente:

//passphrase for keystore char[] keystorePass="password".toCharArray(); //load own keystore (MyApp just holds reference to application context) KeyStore keyStore=KeyStore.getInstance("BKS"); keyStore.load(MyApp.getStaticApplicationContext().getResources().openRawResource(R.raw.keystore),keystorePass); //create a factory TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); //get context SSLContext sslContext=SSLContext.getInstance("TLS"); //init context sslContext.init( null, trustManagerFactory.getTrustManagers(), new SecureRandom() ); //create the socket Socket socket=sslContext.getSocketFactory().createSocket("hostname",443); socket.setKeepAlive(true); 

Posteriormente, el bucle de ejecución del subproceso del receptor utiliza socket.getInputStream () para acceder al flujo de entrada. Mientras uso una conexión sin cifrar, esto funciona sin ningún problema. Pero la conexión segura no recupera ningún dato del socket. He verificado esto agregando mensajes de registro al bucle de recepción e incluso usé el s_server de OpenSSL para comprobarlo. Recuperé los datos del cliente, pero el cliente nunca recibió nada de lo que le envié.

Como última prueba, traté de abrir una conexión a www.google.com:443 así:

 javax.net.SocketFactory fact=SSLSocketFactory.getDefault(); Socket socket=fact.createSocket(_config.getUri().getHost(), _config.getUri().getPort()); 

Todavía el mismo resultado, la conexión funciona, pero utilizando el InputStream no recibo nada del servidor.

¿Alguien tiene alguna idea?

EDITAR:

Actualmente no estoy autorizado a responder a mi propia pregunta, pero aquí está la respuesta: Bueno, resulta que el problema era el bucle de recepción. Confié en InputStream.available() para obtener el número de bytes para leer, pero no me di cuenta de que era bastante poco fiable (siempre devuelve 0 para socket SSL). Así que cambié el bucle de recepción para usar el bloqueo read() .

Como se mencionó anteriormente: Resulta que el problema era el bucle de recepción. Confié en InputStream.available() para obtener el número de bytes para leer, pero no me di cuenta de que era bastante poco fiable (siempre devuelve 0 para socket SSL). Así que cambié el bucle de recepción para usar el bloqueo read() .

  • ¿Por qué HttpUrlConnection está lanzando una SSLException mientras está en una conexión de datos móvil?
  • Cómo administrar la conexión ssl cuando el servicio de red cambia
  • Cómo importar certificado SSL autofirmado a Volley en Android 4.1+
  • "Flujo no representa una tienda de claves PKCS12" después de almacenar con una nueva contraseña en el dispositivo Android
  • ¿Cómo habilitar un certificado autofirmado para sockets SSL en Android?
  • Cordova "release" se comporta de forma diferente a "debug" con respecto a SSL
  • La sesión SSL no se reutiliza en Android WebView
  • javax.net.ssl.SSLException con Facebook SDK, Android
  • Https conexión, las diferencias entre Android 2.3 y 4
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException: Nombre de host domain.com no verificado
  • Javax.net.ssl.SSLHandshakeException: Handshake falló en Android 5.0.0 cuando SSLv2 y SSlv3 están deshabilitados (sólo TLS) (y mayores)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.