私が取り組んでいるアプリケーションのTLS上でTCPソケットを使って作業する必要があります。私は数十の例を見てきましたが、私はハンドシェイクをうまくやっても問題はありませんが、何らかの方法で入力ストリームを読むことはできません(readline()、文字配列への読み込みなど)。試してみるたびに、その場所でアプリがフリーズします。私がデバッグした場合、次のコード行には決して行きません。Android SSLEngineの例
試行された解決策では、SSLEngineを使用するように移行しました.SSLEngineは、SSL用のjava.nioに対するJava 1.5の回答であるはずです。しかし、の例(ここではhttp://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java)が少し混乱していますが、実装に成功していません。私が試してみると、unwrap()コールは空のバッファを生成します。ここで問題のサービスがデータをパイプに戻すことがわかっています(OpenSSLの使用から)。
提案は大歓迎です、私はすでにこれに時間をかけすぎてしまいました。ここに関連するコードです:
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());
アップデートとして、(rslt.getStatus()!= SSLEngineResult.Status.OK)の間にアンラップコールでループ処理を試みましたが、決してデータが入力されず、ステータスがOKになりませんでした。 – Paul
このコードを通常のJavaアプリケーションで実行しようとしましたか?それは少なくともAndroidに固有の問題かどうかを判断するのに役立ちます。 – elevine
ええ、私はそれがアンドロイドに固有だとは思わない、私はちょうどアンドロイドプロジェクトでそれをやっていることが起こる。 – Paul