2012-01-02 23 views
10

Estoy tratando de conectar una aplicación de Android a un servidor con SSL habilitado, que utiliza un certificado autofirmado. Ya he leído docenas de tutoriales y la aplicación ahora acepta el certificado & que se conecta al servidor, pero nunca me devuelve ningún dato.Crear SSL-Socket en Android con certificado autofirmado

El código original i utiliza para inicializar el socket es la 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); 

Después, el bucle de ejecución de la rosca receptor utiliza socket.getInputStream() para acceder al flujo de entrada. Siempre que use una conexión no encriptada, esto funciona sin problemas. Pero la conexión segura no recupera ningún dato del zócalo. Lo he verificado añadiendo mensajes de registro al bucle de recepción e incluso usé el s_servidor de OpenSSL para verificar. Recuperé datos del cliente, pero el cliente nunca recibió nada que le haya enviado.

Como última prueba, he tratado 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()); 

Aún así el mismo resultado, trabajos de conexión, pero utilizando el InputStream recibo nada desde el servidor .

¿Alguien tiene alguna idea?

EDIT:

estoy actualmente no se les permite responder a mi propia pregunta, pero aquí está la respuesta: Pues bien, resulta que el problema era el lazo de recibir. Confié en InputStream.available() para obtener el número de bytes para leer, pero no me di cuenta de que no era confiable (siempre devuelve 0 para socket SSL). Así que cambié el bucle de recepción para usar el bloqueo read() en su lugar.

Respuesta

7

Como se mencionó anteriormente: Resulta que el problema FUE 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 no era confiable (siempre devuelve 0 para socket SSL). Así que cambié el bucle de recepción para usar el bloqueo read() en su lugar.

+0

¿Es apropiado tener dos hilos, uno para enviar datos y otro para recibir? – snapfractalpop

+2

Sí, en mi opinión, debe usar dos hilos, especialmente si está utilizando la comunicación full-duplex. También he leído un par de publicaciones, esto debería ser bastante seguro ya que estás usando diferentes flujos para leer y escribir. – mistalee

Cuestiones relacionadas