Necesito trabajar con un socket TCP sobre TLS para una aplicación en la que estoy trabajando. He pasado por docenas de ejemplos y aunque no tengo problemas para obtener el protocolo de enlace, parece que no puedo leer el flujo de entrada por ningún medio (intenté mucho, incluyendo readline(), lectura a matriz de caracteres, etc.). cada vez que lo intento, la aplicación se congela en ese punto. Si depuro, nunca pasa a la siguiente línea de código.Ejemplo de Android SSLEngine
En un intento de solución, decidí pasar a usar un SSLEngine, ya que se supone que es la respuesta de Java 1.5 a java.nio para SSL. Sin embargo, he encontrado uno ejemplo (aquí: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java) que es más que un poco confuso para mí, y no he tenido éxito en su implementación. Cuando lo intento, la llamada desenvolver() produce un buffer vacío, donde sé (usando OpenSSL en la línea de comandos) que el servicio en cuestión empuja los datos hacia abajo por la tubería.
Sugerencias son bienvenidas, ya me he quemado demasiado tiempo en esto. Aquí está el código correspondiente:
SSLEngine engine = sslContext.createSSLEngine(uri.getHost(), uri.getPort());
engine.setUseClientMode(true);
engine.beginHandshake();
SSLSession session = engine.getSession();
int bufferMax = session.getPacketBufferSize();
int appBufferMax = session.getApplicationBufferSize() + 50;
ByteBuffer cTo = ByteBuffer.allocateDirect(bufferMax);
ByteBuffer sTo = ByteBuffer.allocateDirect(bufferMax);
ByteBuffer out = ByteBuffer.wrap(sessionId.getBytes());
ByteBuffer in = ByteBuffer.allocate(appBufferMax);
debug("sending secret");
SSLEngineResult rslt = engine.wrap(out, cTo);
debug("first result: " + rslt.toString());
sTo.flip();
rslt = engine.unwrap(sTo, in);
debug("next result" + rslt.toString());
Como una actualización, también probé bucles en la llamada de desencaje mientras (rslt.getStatus()! = SSLEngineResult.Status.OK), y nunca se llenó, y el estado nunca se convirtió en OK. – Paul
¿Ha intentado ejecutar este código en una aplicación Java normal? Eso al menos ayudaría a determinar si es un problema específico de Android o no. – elevine
Sí, no creo que sea específico de Android, simplemente lo estoy haciendo en un proyecto de Android. – Paul