【问题标题】:SSL Handshake and Server ResponseSSL 握手和服务器响应
【发布时间】:2016-03-02 12:54:00
【问题描述】:

我想知道如果在 SSL 握手或 TCP 握手期间网站内容发生变化会发生什么?

例如:

客户端和服务器之间的 TCP 或 SSL 握手恰好在 16:02:00 点开始。由于某种原因,握手需要很长时间。比如说 5 秒。

所以握手在 16:02:05 完成,有一些延迟但成功。客户端开始获取内容。

但是如果网站内容在 ssl 握手时发生变化。例如,如果它在 16:02:03 发生变化,会发生什么?

  • 假设在 16:02:00 站点内容是:“ABCD”(当 ssl 或 tcp 握手开始时)

  • 并在 16:02:03 变为:“ABCD1234”(握手继续)

所以客户端得到其中的哪一个; “ABCD”还是“ABCD1234”?

这是获取服务器响应的客户端 java 代码:

  Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
  URL obj = new URL(url); // url is https
  HttpURLConnection con = (HttpURLConnection) obj.openConnection(proxy);
  con.setConnectTimeout(10000);
  con.setReadTimeout(15000);

  int responseCode = con.getResponseCode();

  InputStream is =    con.getInputStream();

【问题讨论】:

    标签: java http ssl tcp https


    【解决方案1】:

    服务器在打开响应文件时发送当前响应(或从任何地方获取响应)。只有在服务器收到 HTTP 请求后才能知道完整的 URL。此请求仅在已建立的 SSL 隧道内的 SSL 握手之后完成。因此它不会提供握手之前的版本。

    【讨论】:

      【解决方案2】:

      您帖子中包含的代码并未明确使用 SSL,但使用 SSL,必须先进行握手。在握手完成(并且有效)之前不会下载任何内容,因为在此之前无法完成任何请求。 Handskake 必须完成才能正确编码和解码请求。

      【讨论】:

      • 我的 url 是 https 并且代码使用 ssl 握手。我可以在 ssl java 调试模式下看到它。所以你说在我的情况下我得到了“ABCD1234”的输入流。对吗?
      • 是,或者不是。这取决于您的服务器实现。如果旧内容在缓存或内存中,发生了什么变化(磁盘上的文件?),当你读取它时(仅在请求之后或之前?)等等。但是是的,我说你只在握手完成后处理请求,并且如果您此时开始计算内容(例如读取文件),它应该包括直到这一刻之前的所有更改
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2013-09-30
      相关资源
      最近更新 更多