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:
- Error en la autenticación mutua en Android con javax.net.ssl.SSLHandshakeException: El apretón de manos falló
- Error de lectura: error en la biblioteca SSL, generalmente un error de protocolo
- Android - convertir la cadena de certificados pkcs12 al objeto de certificado x509 para bks keystore
- El ancla de la confianza para la trayectoria del certificado no encontrada al usar sobre 3g pero trabaja muy bien sobre WiFi
- Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado de compañero mientras estoy trabajando con google place api en android
//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()
.
- Soporte para Android SSL - SNI
- Android HttpClient y HTTPS
- ¿Cómo se puede cargar https url sin el uso de ssl en android webview
- Android se conecta al servidor con certificado autenticado
- OkHttp javax.net.ssl.SSLPeerUnverifiedException: Nombre de host domain.com no verificado
- Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado igual mientras intentaba conectarse usando https con .bks keystore
- Android - ¿Cómo almacenar certificado en keystore mediante programación?
- Comportamiento de tipo navegador en certificados no válidos / autofirmados
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()
.
- Actualizar la animación del elemento de menú en ActionBarSherlock
- Cómo obtener el ID de archivo para poder realizar una descarga de un archivo de la API de Google Drive en Android