我有一个启用了SSL的客户端,但没有我的服务器。
背景:所以我试图做的是,
客户端:
- 客户端尝试连接到服务器
- 尝试写入流
- 读取服务器写入的数据
- 关闭康涅狄格州
服务器端:
- 服务器接受 TCP 连接
- 尝试将客户端写入流的数据读取
- 将回复写回客户端
- 关闭康恩
实际发生的是, 服务器开始侦听端口,然后客户端在握手出现之前连接到服务器。
连接到服务器意味着,客户端执行以下内容
SSLSocket sock = (SSLSocket)sslsocketfactory.createSocket(remoteAddress, port);
服务器接受使用,
ServerSocket.accept();
i/e 客户端和服务器端步骤 1>已完成
到目前为止,握手尚未触发。
现在,当客户端尝试写入流时,在握手触发之前。
即客户端现在已进入步骤2>服务器也用于读取数据。
我分析了WireShark中的数据包,客户端向客户端发送了Hello。 现在,由于服务器未启用SSL,因此它在从客户端读取数据时卡住/停止,并且客户端卡住,因为它正在等待服务器Hello消息。
最终双方都超时,但实际上应该如何处理。
最终双方都超时,但实际上应该如何处理。
鉴于客户端不知道服务器不说 TLS,对于客户端来说,没有比在一段时间后服务器没有响应超时更好的方法了。相反,服务器可能会尝试尽早检查客户端发送的数据是否属于预期的协议。这对于HTTP来说是可能的,因为ClientHello的前几个字节看起来与有效HTTP请求的开头完全不同。类似的启发式方法也可能适用于其他应用程序协议,但并非适用于所有协议。
您的客户端正在尝试通过 TCP 套接字启动 SSL 握手。如果您想要使用 SSL(证书和密码套件(的安全 TCP 连接,这很好。但是您还需要有一个知道如何在SSL中进行通信的服务器。看这里。
基本上,您的服务器是一个"裸"TCP服务器,对SSL一无所知。因此,当您的SSL客户端尝试与服务器建立连接时,它会启动正常的SSL握手(客户端使用密码套件发送问候(。服务器接收此数据,但它对它没有任何特殊意义,因此它不会响应 SSL 服务器应该如何响应(服务器使用自己的密码套件及其证书响应 hello(。因此,当客户端等待该响应时,它最终会超时。
解决方案将您的服务器更改为上面链接的 SSLSocketServer (如果您想要安全的 SSL 连接并拥有证书,则可以选择(或将客户端更改为普通套接字客户端