我有一个启用了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 消息而被卡住。
最终双方超时,但实际上应如何处理。
答案 0 :(得分:0)
最终双方超时,但实际上应如何处理。
鉴于客户端不知道服务器不会讲TLS,因此对于客户端而言,没有比服务器无响应后超时超时更好的方法了。相反,服务器可能会尝试尽早检查客户端发送的数据是否属于预期的协议。这对于HTTP是可能的,因为ClientHello的前几个字节看起来与有效HTTP请求的开始完全不同。对于其他应用程序协议,类似的启发式方法也可能适用,但并非对所有应用程序都适用。
答案 1 :(得分:0)
您的客户端正在尝试通过TCP套接字启动SSL握手。如果您想要使用SSL(证书和密码套件)的安全TCP连接,那就很好。但是您还需要有一台知道如何使用SSL进行通信的服务器。看here。
基本上,您的服务器是对SSL一无所知的“裸” TCP服务器。因此,当您的SSL客户端尝试与服务器建立连接时,它将启动正常的SSL握手(客户端使用密码套件发送问候)。 Server接收到此数据,但是它没有什么特别的含义,因此它不会响应SSL服务器应如何响应(Server使用其自己的密码套件和证书来打招呼)。因此,当客户端等待该响应时,它最终会超时。
解决方案 可以将服务器更改为上面链接的SSLSocketServer(如果需要安全的SSL连接并具有证书,则可以选择),也可以将客户端更改为普通套接字client