【问题标题】:Does OpenSSL *require* the application to send/read non-application data?OpenSSL *要求*应用程序发送/读取非应用程序数据吗?
【发布时间】:2021-09-09 21:59:17
【问题描述】:

让我们假设有一个客户端和一个服务器,并且服务器发送一个 rekey 请求,或任何其他可能重要或可能不重要的非应用程序数据(这里一般说)。我想知道我是否绑定为 OpenSSL 发送和读取数据,以便我可以让我的生活和代码更简单。为了让你明白我的意思,我准备了这些例子:

假设我们成功地进行了 TLS 握手并且现在准备好交换数据。客户端向服务器发送一个 HTTP 请求,Connection 标头设置为close,这意味着它不会再发送任何请求。现在 OpenSSL 想在后台做一些事情,因此要求发送。也许我们做了shutdown(SHUT_WR) 但不能这样做,或者内核缓冲区永久满了。

假设一个游戏需要交换大量数据——服务器向客户端发送有关游戏的信息,客户端向服务器发送有关鼠标和键盘的信息。通常,在数据交换期间,OpenSSL 将有足够多的机会做它想做的任何事情,因此实际上不需要明确地监听它的 WANTS_something 请求。现在,如果客户端 AFK,它不会发送任何键盘和鼠标信息,但 OpenSSL 想要做一些需要我们发送一些东西的事情(如果可能有这样的事件)。

以上两种情况都有一个共同的想法。问题是:OpenSSL 能否在不发送/接收 TLS 数据的情况下继续发送/接收用户数据?还是要求应用程序满足 OpenSSL 的请求以保持健康的连接/加密?

如果需要它来满足它的请求,那么我在编码时可能会遇到另一个问题。假设它请求读取以处理非应用程序数据,但队列中的第一个实际上是应用程序数据。我总是希望仅在应用程序请求时才读取应用程序数据,否则毫无意义,因为我们缓冲了可能实际上不会使用的数据,并且对等方将继续发送数据,因为 TCP 拥塞窗口不会缩小(因为我们读取数据)。或者,OpenSSL 将在内部缓冲应用程序数据,这是相同的场景,因为最终我需要将数据从其中刷新以处理更多非应用程序数据。是否有任何标志或仅处理非应用程序数据的方法?还有其他很酷的解决方案吗?

是的,我明白在握手和关机期间发送非应用程序数据是必需的。

【问题讨论】:

  • 当您使用 OpenSSL 时,每个请求(打开、关闭、关闭、发送接收和其他)都通过 OpenSSL。您不使用套接字 API 处理数据,而是使用 OpenSSL API。所以在我看来,你问的问题是无关紧要的。

标签: c linux openssl tls1.3


【解决方案1】:

除了初始握手和关闭序列之外,TLS 仅在应用程序请求时发送消息。如果您没有做任何特别的事情并且您从 OpenSSL 收到 WANT_READWANT_WRITE 错误(或来自任何 TLS 库的类似指示),这意味着您需要继续读取或写入以完成发送您自己的数据,或从您的同行接收数据。

任何一方都可以发送密钥更新请求,但它只会这样做,因为它需要它才能传输更多数据。

如果启用了相应的扩展,任何一方都可以发送heartbeat。如果您不想要心跳,则不必启用它们。如果你已经表明你接受了心跳,你不需要立即阅读它们,但是如果你延迟阅读它们太久,你的对端可能会断开连接。但是,再次强调,这是一个可选功能,如果您不想要它,请不要启用它。

TLS 是一个严格的流协议,所以如果有任何非应用数据,你必须先读取它,然后才能读取后续应用数据。您不能只跳过非应用程序数据。

我总是希望仅在应用程序要求时才读取应用程序数据

联网应用程序通常不是这样工作的。通常您无法预测您的对等方何时将发送数据,因此您不会在不读取应用程序数据的情况下无限期阻塞。无论数据是否通过 TLS,这同样适用:您在网络套接字和其他文件描述符上使用 select(或 poll 或等效项),并且如果网络套接字上有可用数据,则您从中读取。与 TLS 的不同之处在于您从 SSL 套接字读取而不是直接从网络套接字读取; OpenSSL 将负责从网络套接字读取。

否则这是毫无意义的,因为我们缓冲了我们可能不会实际使用的数据,而对等方将继续发送数据,因为 TCP 拥塞窗口不会缩小(因为我们读取了数据)。

如果您不想在应用程序尚未准备好处理数据时无限期地缓冲数据,请不要继续阅读它。数据是直接来自 TCP 还是通过 TLS 没有任何区别。

是否有任何标志或方法只处理非应用程序数据?

没有办法只读取非应用程序数据,因为必须从 TCP 套接字读取数据才能知道它是否是应用程序数据。但这有什么关系呢?

还有其他很酷的解决方案吗?

我无法确定我的答案是否“酷”,或者是否是“解决方案”,因为我没有看到问题所在。据我所知,您想象的是一个定义不明确但实际上并不存在的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多