gpt4 book ai didi

关闭连接后 Java TLS session 重用

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:02 28 4
gpt4 key购买 nike

我有一个 Java TLS 客户端,它可以向服务器发送一系列请求,每个请求后跟来自服务器的响应。

但是,有许多不同的服务器。有些是“多消息”服务器,在第一个请求后保持连接打开,以便后续请求可以通过第一个连接发送。其他是“单消息”服务器,它们在每条消息后关闭连接,因此后续消息需要新连接。客户端无法先验地知道它正在与哪种类型的服务器通信,也无法修复服务器。

非常希望单消息服务器能够在没有完全握手的情况下恢复 session 。

我原来的客户端代码只是试图通过同一个连接发送后续请求。如果失败,它只是打开一个到服务器的新连接。因此,它可以处理单消息和多消息服务器。

但是,向单消息服务器发送第二条消息时的失败似乎终止了 session 恢复。

我的肮脏工作是注意消息是否失败,然后假设它正在与单消息服务器通信,在这种情况下,客户端然后在收到每个响应后显式关闭套接字。这使后续连接能够恢复 session 。

但必须有更好的方法。毫不奇怪,测试 isInputShutdown 或 isConnected 没有帮助,因为存在计时问题。单消息服务器的连接失败实际上发生在读取响应期间,在写入请求之后,可能是由于缓冲。

有什么想法非常感谢吗?

最佳答案

对于明文,您最初的解决方案是正确的:您将在发送第二条消息时收到 IOException: connection reset by peer,您可以通过重新连接相应地恢复。

但是在 TLS 情况下它不会工作,因为你不会得到 IOException: connection reset by peer 而是 SocketException,由于致命的 TLS unexpected_message 警报。 RFC 2246 #7.2状态:

Alert messages with a level of fatal result in the immediate termination of the connection. In this case, other connections corresponding to the session may continue, but the session identifier must be invalidated, preventing the failed session from being used to establish new connections.

[我的重点],因为失败的 session 现在被认为是不安全的,并且

unexpected_message

An inappropriate message was received. This alert is always fatal and should never be observed in communication between proper implementations.

您的第二个解决方案似乎适合我。

注意:

  • isInputShutdown() 永远不可能为真,因为您无法在 SSLSocket 上调用 shutdownInput()
  • isConnected() 一旦套接字已连接,就永远不会为 false。
  • 两者都会告诉您套接字的状态,而不是连接的状态,因此即使尝试它们也是徒劳的。而且它与“时间问题”无关。

关于关闭连接后 Java TLS session 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425891/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com