【问题标题】:Using OpenSSL TLS with or without BIO?使用带或不带 BIO 的 OpenSSL TLS?
【发布时间】:2015-04-03 20:11:19
【问题描述】:

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

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

例如,this wiki page 演示了如何设置准系统 TLS 服务器。示例中的任何地方甚至都没有提及 BIO。

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

为了让它更加混乱,this man page 建议 SSL 结构有一个“底层 BIO”不需要明确设置它

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

【问题讨论】:

  • BIO 的一个用途是将现有套接字升级到 TLS。
  • @user207421:您可以在不使用 BIO 的情况下将套接字升级到 TLS,只需在现有 TCP 套接字上使用 SSL_set_fd 后跟 SSL_connectSSL_accept
  • 非洲燕子还是欧洲燕子?

标签: ssl openssl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    首先,你的 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 describes 一样,它们通常都设置为一个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 网页就是这种情况(顺便说一句,它适用于客户端而不是服务器)。这类似于 Unix 的“一切(大部分)都是文件”的理念,例如实用程序 grep,只需在 fd 0 上调用 read,就可以从文件、终端、管道中搜索数据另一个程序,或者(如果在 inetd 或类似程序下运行)来自使用 TCP(但不是 SSL/TLS,因为它不在操作系统中)的远程系统。我还没有遇到很多能够轻松地将 SSL/TLS 数据与其他类型的源/接收器交换特别有益的情况,但 OpenSSL 确实提供了这种能力。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多