【问题标题】:Which class should be used to create TLS connection in java. Socket class or SSLSocket class?应该使用哪个类在 java 中创建 TLS 连接。套接字类还是 SSLSocket 类?
【发布时间】:2014-04-08 18:34:38
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

    标签: java sockets ssl openfire sslsocketfactory


    【解决方案1】:
    • 很明显,服务器的文档说它只支持通过该端口的 TLS 是错误的,并且
    • 显然它使用了 STARTTLS 功能,您可以通过该功能从纯文本连接开始,并可以通过发出 STARTTLS 命令将其升级到 TLS。

    【讨论】:

    • 感谢您的回复。但我没有发送任何启动 tls 命令,数据似乎仍然是加密的。这怎么可能。
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多