我已经阅读了很多有关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,而另一些却没有?空载燕子的空速是多少?
答案 0 :(得分:1)
BIO始终存在,但是它们可能被更简单的界面隐藏。如果您想要更多控制-花费更多精力,直接使用BIO界面将很有用。如果只想在TCP套接字上使用TLS,则简单的接口通常就足够了。相反,如果您想在自己的基础传输层上使用TLS,或者想要对它与传输层的交互方式进行更多控制,则需要BIO。
这种用例的示例是this proposal,其中TLS在HTTPS内以JSON的形式隧道传输,即TLS帧以JSON编码,然后使用POST请求和响应进行传输。这可以通过使用内存BIO处理TLS来实现,然后将其编码为JSON或从JSON解码。
答案 1 :(得分:0)
首先,您的Q不太清楚。 SSL
是C结构类型(是typedef),您不能在C中的结构类型上使用点运算符,只能使用实例。就像人们有时所说的那样,即使假设您的意思是“ SSL
的实例”,在较旧的版本(通过1.0.2版)中,它也没有成员read
和write
以及1.1版。向上为0是不透明的-您甚至都不知道其成员是什么。
第二,适用于SSL库的BIO使用有两种不同的级别。 SSL / TLS连接(由SSL
对象表示,再加上链接到它的一些相关内容,例如会话)始终使用两个BIO分别发送和接收协议数据-包括包含您所需要的应用程序数据的两个协议数据使用SSL_write
发送和使用SSL_read
接收,以及库中处理的SSL / TLS握手。与Steffen describes一样,它们通常都设置为一个套接字BIO,用于向相应的远程主机进程发送和从其接收消息,但是可以将它们设置为在其间甚至执行其他操作的BIO。 (这种正常情况是由SSL_set_{,r,w}fd
自动创建的,应该在Windows上注意到它实际上需要一个套接字句柄-但没有任何其他文件句柄;只有在Unix上,套接字描述符才可以与文件描述符半互换。)>
另外,可以将SSL / TLS连接本身“包装”在ssl-BIO中。这使应用程序可以使用与纯TCP连接(使用套接字BIO)或本地文件相同的API调用,以及提供的“过滤器” BIO(例如摘要(md)BIO)来处理SSL / TLS连接或base64编码/解码BIO,以及您添加的所有其他BIO。链接的IBM网页就是这种情况(它是针对客户端而不是服务器BTW)。这类似于Unix的“一切都是(大部分是文件)”哲学,例如,实用程序grep
通过在fd 0上简单地调用read
就可以从文件中搜索数据,终端,来自另一个程序的管道,或者(如果在inetd或类似环境下运行)使用TCP(但不是SSL / TLS的远程系统,因为它不在操作系统中)来自远程系统。我还没有遇到过很多情况,能够轻松地与其他类型的源/接收器交换SSL / TLS数据特别有益,但是OpenSSL确实提供了这一功能。