java - 如何处理服务器未启用 SSL/TLS 但客户端在 Java 中启用了 SSL/TLS 的负面测试用例

标签 java sockets ssl tcp handshake

我有一个启用了 SSL 但不是我的服务器的客户端。

背景:所以我想做的是,

客户端:

  1. 客户端尝试连接到服务器
  2. 尝试写入流
  3. 读取服务器写入的数据
  4. 关闭conn

服务器端:

  1. 服务器接受 TCP 连接
  2. 尝试将客户端写入的数据读入流中
  3. 将回复写回给客户
  4. 关闭Conn

实际发生的是, 服务器开始监听端口,然后客户端在握手开始之前连接到服务器。

连接到服务器意味着,客户端执行以下操作

SSLSocket sock = (SSLSocket)sslsocketfactory.createSocket(remoteAddress, port);

并且服务器接受使用,

ServerSocket.accept();

i/e ClientSide 和 ServerSide 步骤 1> 已完成

到现在还没有触发握手。

现在,当客户端尝试写入流时,在握手触发之前。

即客户端现在已进入第 2 步>,服务器也已进入读取数据。

我在 WireShark 中分析了数据包,客户端发送了 Client Hello。 现在,由于服务器未启用 SSL,它在从客户端读取数据时卡住/停止,而客户端因为等待 Server Hello 消息而卡住。

最终双方都超时了,但实际应该如何处理。

最佳答案

Eventually both side timeout but how should it be handled actually.

鉴于客户端不知道服务器不使用 TLS,如果服务器没有响应,客户端没有比在一段时间后超时更好的方法。服务器可能会尝试尽早检查客户端发送的数据是否属于预期的协议(protocol)。这对于 HTTP 是可能的,因为 ClientHello 的前几个字节看起来与有效 HTTP 请求的开头完全不同。类似的启发式方法也可能适用于其他应用程序协议(protocol),但并非适用于所有协议(protocol)。

关于java - 如何处理服务器未启用 SSL/TLS 但客户端在 Java 中启用了 SSL/TLS 的负面测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947149/

相关文章:

java - 如何在 Netbeans 中使用热交换?

.net - UDP负载测试: How do you simulate many UDP clients?

angularjs - 当 Node JS 进程完成时使用 Socket IO 发出消息

Powershell WebClient 放弃遇到 SNI 错误

php - SSL 连接 PHP MYSQL SSL

java - Java/Clojure 中的 SSL 无法访问证书路径

java - 如何使用method.inserAt();正确地

关闭后Java线程仍在内存中

java - Kafka连接confluent elasticsearch sink(找不到类报错)

JAVA NIO ByteBuffer 分配以适应最大的数据集?