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



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

背景:所以我试图做的是,

客户端:

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

服务器端:

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

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

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

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 连接并拥有证书,则可以选择(或将客户端更改为普通套接字客户端

相关内容

  • 没有找到相关文章

最新更新