2

我已经阅读了很多关于 OpenSSL 的内容,特别是 TLS 和 DTLS API。大部分都是有道理的,一旦你理解了它,它就是一个非常直观的 API。不过有一件事真的让我摸不着头脑……

我何时/为什么要使用 BIO?

例如,此 wiki 页面演示了如何设置准系统 TLS 服务器。示例中的任何地方都没有提到BIO。

现在这个页面专门使用 BIO,而不是使用 SSL 结构的读取和写入功能。当然它是从 2013 年开始的,但它并不是唯一使用 BIO 的。

为了使它更加混乱,这个手册页建议 SSL 结构有一个“底层 BIO” ,而无需显式设置它

那么,如果我可以摆脱使用SSL_read()and ,我为什么还要使用 BIOSSL_write()呢?有什么优势?为什么有些示例使用 BIO 而其他示例不使用?空载燕子的空速是多少?

4

2 回答 2

4

BIO 始终存在,但它们可能会被更简单的界面隐藏。如果您想要更多的控制,直接使用 BIO 界面很有用 - 需要付出更多的努力。如果您只想在 TCP 套接字上使用 TLS,那么简单的接口通常就足够了。如果您想在自己的底层传输层上使用 TLS,或者如果您想更好地控制它与传输层的交互方式,那么您需要 BIO。

这种用例的一个例子是这个提议,其中 TLS 在 HTTPS 内作为 JSON 进行隧道传输,即 TLS 帧以 JSON 编码,然后使用 POST 请求和响应进行传输。这可以通过使用内存 BIO 处理 TLS 来实现,然后将其编码为 JSON 并从 JSON 解码。

于 2019-06-14T04:44:10.927 回答
1

首先,你的Q不是很清楚。SSL是 C 结构类型(的 typedef),您不能在 C 中的结构类型上使用点运算符,只能在实例上使用。即使假设您的意思是“的实例SSL”,就像人们有时所做的那样,在旧版本中(通过 1.0.2)它没有成员readwrite并且在 1.1.0 更高版本中它是不透明的——您甚至不知道它是什么成员是。

其次,有两种不同级别的 BIO 使用适用于 SSL 库。SSL/TLS 连接(由SSL对象表示,加上一些与它相关的东西,如会话)总是使用两个 BIO 分别发送和接收协议数据——包括包含您发送SSL_write和接收的应用程序数据的协议数据SSL_read,以及在库中处理的 SSL/TLS 握手。正如Steffen 所描述的那样,这些通常都设置为一个 socket-BIO,用于向适当的远程主机进程发送和接收,但它们可以设置为在两者之间执行其他操作的 BIO,甚至可以代替。(这种正常情况是由自动创建的SSL_set_{,r,w}fd应该注意的是,在 Windows 上实际上需要一个套接字句柄——但不是任何其他文件句柄;只有在 Unix 上,套接字描述符才能与文件描述符半互换。)

另外,SSL/TLS 连接本身可以“包装”在 ssl-BIO 中。这允许应用程序使用与普通 TCP 连接(使用 socket-BIO)或本地文件几乎相同的 API 调用来处理 SSL/TLS 连接,以及提供的“过滤器”BIO,如摘要 (md) BIO或 base64 编码/解码 BIO,以及您添加的任何其他 BIO。您链接的 IBM 网页就是这种情况(BTW 是客户端而不是服务器)。这类似于 Unix 的“一切都是(大部分)文件”哲学,例如实用程序grep,只需调用read在 fd 0 上,可以从文件、终端、来自另一个程序的管道或(如果在 inetd 或类似系统下运行)使用 TCP(但不是 SSL/TLS,因为它不在操作系统中)从远程系统中搜索数据)。我还没有遇到很多能够轻松地将 SSL/TLS 数据与其他类型的源/接收器交换特别有益的情况,但是 OpenSSL 确实提供了这种能力。

于 2019-06-14T06:20:50.157 回答