Muszę pracować z gniazdem TCP przez TLS dla aplikacji, nad którą pracuję. Przeszedłem przez dziesiątki przykładów i podczas gdy nie mam problemu z przechodzeniem przez uścisk dłoni, nie mogę wydawać się odczytywać strumienia wejściowego w jakikolwiek sposób (próbowałem dużo, włączając readline(), czytanie do tablicy znaków, itp.). za każdym razem, gdy próbuję, aplikacja zamarza w tym miejscu. Jeśli debuguję, nigdy nie przechodzi do następnej linii kodu.Przykład SSLEngine Android
Podjęłam próbę przejścia do używania SSLEngine, ponieważ jest to odpowiedź Java 1.5 dla java.nio na SSL. Jednak znalazłem jeden przykład przykład (tutaj: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java), który jest dla mnie nieco mylący i nie udało mi się go wdrożyć. Kiedy próbuję, wywołanie unwrap() daje pusty bufor, gdzie wiem (z wykorzystaniem OpenSSL w linii poleceń), że dana usługa przesyła dane z powrotem do potoku.
Propozycje są mile widziane, już wypaliłem za dużo czasu. Oto odpowiedni kod:
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());
W ramach aktualizacji próbowałem również zapętlić wywołanie podczas gdy (rslt.getStatus()! = SSLEngineResult.Status.OK), i nigdy nie było zapełniane, a status nigdy nie był poprawny. – Paul
Czy próbowałeś uruchomić ten kod w zwykłej aplikacji Java? To przynajmniej pomoże ustalić, czy jest to problem specyficzny dla Androida, czy nie. – elevine
Tak, nie sądzę, że jest to specyficzne dla Androida, po prostu robię to w projekcie Android. – Paul