Ho bisogno di lavorare con un socket TCP su TLS per un'app su cui sto lavorando. Ho passato dozzine di esempi e mentre non ho problemi a superare la stretta di mano, non riesco a leggere il flusso di input attraverso qualsiasi mezzo (ho provato molto, incluso readline(), lettura su array di caratteri, ecc.). ogni volta che provo, l'app si blocca in quel punto. Se eseguo il debug, non passa mai alla riga successiva del codice.Esempio SSLEngine Android
In una soluzione tentata, ho deciso di passare a utilizzare un SSLEngine, poiché si suppone che sia la risposta Java 1.5 a java.nio per SSL. Tuttavia, ho trovato un esempio (qui: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java) che è più che un po 'di confusione per me, e non ho avuto successo nell'implementarlo. Quando provo, la chiamata unwrap() restituisce un buffer vuoto, dove so (dall'uso di OpenSSL sulla riga di comando) che il servizio in questione spinge i dati indietro nella pipe.
I suggerimenti sono benvenuti, ho già bruciato troppo tempo su questo. Ecco il codice rilevante:
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());
Come aggiornamento, ho anche provato a eseguire il ciclo sulla chiamata unwrap mentre (rslt.getStatus()! = SSLEngineResult.Status.OK) e non è mai stato compilato e lo stato non è mai diventato OK. – Paul
Hai provato a eseguire questo codice in una normale applicazione Java? Questo aiuterebbe almeno a determinare se si tratta di un problema specifico per Android o meno. – elevine
Sì, non penso sia specifico per Android, mi è capitato di farlo in un progetto Android. – Paul