我有一个启用了 SSL 但不是我的服务器的客户端。
背景:所以我想做的是,
客户端:
- 客户端尝试连接到服务器
- 尝试写入流
- 读取服务器写入的数据
- 关闭conn
服务器端:
- 服务器接受 TCP 连接
- 尝试将客户端写入的数据读入流中
- 将回复写回给客户
- 关闭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/