我正在尝试创建一个简单的Java客户端以连接到状态服务器(Openfire)的端口5223。状态服务器文档告诉我,此端口仅支持安全的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类呢?

任何帮助表示赞赏。

最佳答案

  • 显然,服务器的文档是错误的,因为它仅通过该端口支持TLS,而
  • 显然,它使用的是STARTTLS功能,可通过该功能从纯文本连接开始,并可以通过发出STARTTLS命令将其升级到TLS。
  • 关于java - 应该使用哪个类在Java中创建TLS连接。套接字类还是SSLSocket类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22219151/

    10-11 23:06
    查看更多