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

标签 java sockets ssl openfire sslsocketfactory

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

相关文章:

Azure 前门和自定义域

IIS 8 HTTPS/Require SSL 导致超时错误

Java 默默地无法从数组打印

java - 如果两者都被评估,比较文字的顺序是否重要?

java - 如何测试 Jersey REST Web 服务?

linux - Jenkins 容器中的 Docker 工具(已安装 Docker 套接字)找不到要连接的 Docker 守护进程

php - 在 PHP SoapClient 中禁用证书验证

java - CascadeType.ALL 和 "insertable = false, updatable = false"是否相互排除?

java - 在java中使用套接字的本地客户端的ID

java - Clojure 中的套接字编程