作業中のアプリの TLS 経由で TCP ソケットを使用する必要があります。私は何十もの例を経験してきましたが、ハンドシェイクを通過するのに問題はありませんが、入力ストリームを何らかの手段で読み取ることができないようです (readline()、文字配列への読み取りなどを含む多くのことを試しました)。試すたびに、アプリはその場でフリーズします。デバッグすると、コードの次の行に進みません。
試行された解決策として、SSL 用の java.nio に対する Java 1.5 の回答であるはずの SSLEngine の使用に移行することにしました。ただし、1 つの例を見つけました (ここ: 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());