应该使用哪个类在java中创建TLS连接。套接字类还是SSLSocket类?

时间:2014-03-06 08:39:17

标签: java sockets ssl openfire sslsocketfactory

我正在尝试创建一个简单的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类。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

  • 显然,服务器的文档说它只支持通过该端口的TLS和
  • 是错误的
  • 显然,它使用的是STARTTLS功能,您可以通过该功能开始使用纯文本连接,并可以通过发出STARTTLS命令将其升级为TLS。