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() .

  • Deshabilitar la comprobación de certificados SSL en la biblioteca de actualización
  • ¿Por qué algunas solicitudes HTTPS fallan al descifrar en Fiddler, mientras que algunas obras?
  • OkHttp SSL handshake abortado en Android
  • ¿Cómo puedo hacer que Android Volley realice una solicitud HTTPS, utilizando un certificado autofirmado por una CA de Unkown?
  • Java - ignorar certificado SSL expirado
  • "Flujo no representa una tienda de claves PKCS12" después de almacenar con una nueva contraseña en el dispositivo Android
  • javax.net.ssl.SSLPeerUnverifiedException: Nombre de host no verificado:
  • Carga de un archivo a través de SSL con Client Side Certificate y HttpsURLConnection de Android
  • Consumir servicio WCF en SSL en Android
  • SSLHandshakeException: Handshake falló en Android N / 7.0
  • SSLSocketFactory establecimiento de tiempo de espera y propiedades de socket
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.