1

プレゼンス サーバー (Openfire) のポート 5223 に接続する単純な Java クライアントを作成しようとしています。プレゼンス サーバーのドキュメントによると、このポートは安全な TLS 接続のみをサポートしています。

そこで、以下のコードを使用して 5223 ポートに接続しようとしました。

SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket= (SSLSocket)factory.createSocket("host",5223);
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
writer.write("some data");
writer.flush();
char r0[]= new char[600];
reader.read(r0);
System.out.println(r0);

これは正常に機能し、(wireshark で) 送信したデータと受信した応答が暗号化されていることがわかりました。

次に、以下のコードを試しました

Socket socket=new Socket("host", 5223);
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
writer.write("some data");
writer.flush();
char r0[]= new char[600];
reader.read(r0);
System.out.println(r0);

驚いたことに(私にとって)これもうまくいきます。唯一の問題は、最初に 7 バイトの予期しない応答があったことです。しかし、その応答をスキップすると、他のすべての応答は正常に機能しているように見え、データが暗号化されていることもわかりました (wireshark を使用)。

私は混乱しています。Socket クラス自体が安全な通信を提供できる場合、なぜ SSLSocket クラスを使用する必要があるのでしょうか。

どんな助けでも大歓迎です。

4

1 に答える 1

1
  • そのポートを介した TLS のみをサポートするというサーバーのドキュメントは明らかに間違っています。
  • 明らかに、プレーンテキスト接続で開始し、STARTTLS コマンドを発行して TLS にアップグレードできる STARTTLS 機能を使用しています。
于 2014-03-07T22:12:13.357 に答える