2017-05-23 11 views
1

私はHttpsURLConnectionを開いています。 どうすれば私のSSLソケットをこの接続に「接続」することができます。これは、別のSSLハンドシェイクを行わないことと、私の暗号を変更しないことを意味します。すでに開かれているSSLセッションでSSLソケットを開く方法セッションのJava

URL url = new URL ("https://example.com:8080"); 
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 
connection.connect(); 

SSLSocketFactory ssf = connection.getSSLSocketFactory(); 
SSLSocket socket = (SSLSocket) ssf.createSocket("example.com", 8080); 

//ここでは、https接続と同じsslセッションにあるソケットでメッセージを送信します。

BufferedWriter out = new BufferedWriter(
         new OutputStreamWriter(s.getOutputStream())); 
out.write("Hello"); 
out.flush(); 
out.close(); 

Javaでこのようなことを行うのは本当ですか?

+0

私は2番目のブロックでS'が本当に 'socket'であると私は8080点に注意してください'前提とHTTPSは珍しいと紛らわしいポートですあなたの2番目のブロックがやっているように、HTTP + SSL/TLS以外のものははるかに少なくなります。 –

+0

@ dave_thompson_085:ポート8080は、ルータやプロキシなどでよく使用されます。 –

+0

@ dave_thompson_085:私はポート443について知っています、この例を挙げてください。これは私の質問ではありません。はいソケットとして申し訳ありません: - D – Vik

答えて

-1

私の知る限りで周りの混乱していない、既存のSSLセッションに新しいソケットを接続することはできません提供すべきです。元のSSLセッションでデータを送受信する場合は、URLConnectionオブジェクトによって作成された元のソケット接続を使用します。あなたはそれのための入力/出力ストリームを取得するためにURLConnection.getInputStream()URLConnection.getOutputStream()メソッドを使用することができます。

URL url = new URL ("https://example.com:8080"); 
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 
connection.connect(); 

... 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); 
out.write("Hello"); 
out.flush(); 
out.close(); 
+0

Javaはデフォルトでセッション共有を行います。それを試してみてください。 – EJP

+0

@Vik:なぜですか?あなたは本当に何を達成しようとしていますか? HTTPSプロキシ経由で任意のTCPサーバーに接続してから、接続が確立された後に任意のデータを送信するように思えます。それは事実ですか?実際には代わりに実際のHTTPSサーバーと通信していますか? –

+0

@RemyLebeau、申し訳ありませんが、別の問題が見つかりました。私の仕事は、単一のSSLセッションで異なるhttpsリクエストを送信することでした。私は、同じソースポートからリクエストを送信するだけです。 – Vik

1

それは限り、セッションが有効であり続けるよう、デフォルトでそのように起こり、そしてあなたがSSLContexts.

+1

そして、サーバーはsessionidを割り当ててキャッシュしました。ほぼすべてが行います。 –

+0

逆に、サーバーがsessionIDを割り当ててキャッシュしなかった場合、再開するセッションはないので、不可能です。 @ dave_thompson_085 – EJP

関連する問題