如何处理否定测试用例,其中在Java中未启用服务器SSL / TLS但在客户端启用SSL / TLS

时间:2019-09-15 18:36:44

标签: java sockets ssl tcp handshake

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

背景:所以我想做的是

ClientSide:

1>客户端尝试连接到服务器

2>尝试写入流

3>读取服务器写入的数据

4>关闭conn

ServerSide:

1>服务器接受TCP连接

2>尝试将客户端写入的数据读入流中

3>写回信给客户

4>关闭Conn

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

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

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

并且服务器接受使用,

ServerSocket.accept();

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

到目前为止,握手尚未触发。

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

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

我在WireShark中分析了数据包,然后客户端发送客户端Hello 。 现在,由于服务器未启用SSL,因此它会卡在/停滞在从客户端读取数据的过程中,并且由于客户端在等待 Server Hello 消息而被卡住。

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

2 个答案:

答案 0 :(得分:0)

  

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

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

答案 1 :(得分:0)

您的客户端正在尝试通过TCP套接字启动SSL握手。如果您想要使用SSL(证书和密码套件)的安全TCP连接,那就很好。但是您还需要有一台知道如何使用SSL进行通信的服务器。看here

基本上,您的服务器是对SSL一无所知的“裸” TCP服务器。因此,当您的SSL客户端尝试与服务器建立连接时,它将启动正常的SSL握手(客户端使用密码套件发送问候)。 Server接收到此数据,但是它没有什么特别的含义,因此它不会响应SSL服务器应如何响应(Server使用其自己的密码套件和证书来打招呼)。因此,当客户端等待该响应时,它最终会超时。

解决方案 可以将服务器更改为上面链接的SSLSocketServer(如果需要安全的SSL连接并具有证书,则可以选择),也可以将客户端更改为普通套接字client