首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SSL_set_bio使用两个指向BIO的指针作为参数?(OpenSSL "BIO_s_mem“与"BIO_s_bio")

为什么SSL_set_bio使用两个指向BIO的指针作为参数?(OpenSSL "BIO_s_mem“与"BIO_s_bio")
EN

Stack Overflow用户
提问于 2018-08-01 11:52:21
回答 1查看 1.8K关注 0票数 5

SSL_set_bio使用两个OpenSSL BIO :输入BIO (rbio)和输出BIO (wbio)。当OpenSSL需要从远程端获取数据时使用第一种方法,当OpenSSL需要向远程端发送数据时使用第二种方法。通常,这两个BIOs是相同的(它们是指向同一个BIO对象的指针)。例如,它可能是套接字BIO (BIO_s_socket)。当OpenSSL需要数据时,它从套接字BIO接收数据。它使用相同的socket BIO来发送数据。所以一个生物物体就足够了。

当需要两种不同的BIO时,我能想到的唯一情况是使用内存BIO (BIO_s_mem)。内存BIO就像回环BIO:任何写入内存BIO的数据都将在随后的读取操作中从其中读取回来。当应用程序在不使用OpenSSL BIOs的情况下自行实现数据传输时,需要内存BIO。应用程序使用自己的函数从远程端接收数据,然后将其放入输入内存BIO,以便OpenSSL能够获得它。相反的过程: OpenSSL将输出数据放入输出内存BIO,然后应用程序从输出BIO中获取数据并使用自己的函数将其发送到远程端。由于需要两个缓冲区(输入和输出),因此单个SSL/TLS链接使用两个不同的内存BIOs。

但除此之外,还有一个名为BIO_s_bio的BIO,它具有类似管道的功能。可以创建一对这样的生物。写入对BIO_s_bio对象中的第一个BIO的任何数据都将从该对象中的第二个BIO中读取。反之亦然:将数据写入第二个BIO将导致从第一个BIO读取这些数据。因此,可以使用BIO_s_bio代替BIO_s_mem。将BIO_s_bio对象的单个实例传递给SSL_set_bio函数就足够了。应用程序接收数据并将其写入BIO_s_bio对中的BIO。然后,OpenSSL将从它的BIO中获得这些数据。OpenSSL在BIO中将数据写入BIO,然后应用程序依次从BIO获取这些数据。

SSL_set_bio只需要两个指向BIOs的指针就可以使用带内存BIO的OpenSSL吗?在SSL_set_bio函数中使用两个不同的BIOs可能有帮助吗?

如果可以使用BIO_s_mem,那么是否需要BIO_s_bio?用BIO_s_mem代替BIO_s_bio有什么好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 13:11:17

通常,SSL/TLS使用一个TCP套接字作为链接。在这种情况下,您可以使用以下函数将fd设置为ssl:

代码语言:javascript
复制
SSL_set_fd(ssl, tcp_socket_fd);

但是,可以使用两个单向文件描述符代替一个TCP套接字的用例。

例如,如果要将TLS服务器实现为tcpd的子服务器。那么您的服务器用于TCP通信的文件描述符是:

  • 输入流的STDIN_FILENO
  • 输出流的STDOUT_FILENO

在这种情况下,不能使用SSL_set_fd(),您可以使用两个BIOs:

代码语言:javascript
复制
   // not tested
   BIO* in = BIO_new_fd(STDIN_FILENO, 0);
   BIO* out = BIO_new_fd(STDOUT_FILENO, 0);
   SSL_set_bio(ssl, in, out);

也许使用SSL_set_rfd()SSL_set_wfd()更好。但那只是个例子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51632606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档