代码之家  ›  专栏  ›  技术社区  ›  anton_rh

为什么SSL_set_bio将bio的两个指针作为参数?(OpenSSL“BIO_s_mem”与“BIO_s_BIO”)

  •  2
  • anton_rh  · 技术社区  · 6 年前

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

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

    但除此之外还有一个名为 BIO_s_bio 它具有类似管道的功能。可以创建一对这样的BIOs。任何写入第一个BIO的数据 比奥 对象将从对中的第二个BIO读取。反之亦然:将数据写入第二个BIO将导致从第一个BIO读取此数据。所以 比奥 可以代替 生物记忆 . 传递的单个实例 比奥 反对 安全套生物 功能就足够了。应用程序接收数据并将其写入 比奥 一对。然后OpenSSL将从它的BIO中获取这些数据。OpenSSL将数据写入到它的BIO中,然后应用程序从它的BIO中依次获取这些数据。

    安全套生物 只需要两个指向BIOs的指针来使用OpenSSL和内存BIO?有没有其他例子在 安全套生物 功能可能有用吗?

    生物记忆 如果需要的话 比奥 可以代替?使用有什么好处吗 生物记忆 而不是使用 比奥 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   SKi    6 年前

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

    SSL_set_fd(ssl, tcp_socket_fd);
    

    但是,在某些用例中,可以使用2个单向文件描述符而不是一个TCP套接字。

    例如,如果要将TLS服务器实现为tcpd的子级。 然后,服务器的TCP流量文件描述符是:

    • 输入流的STDIN_文件号
    • 输出流的STDOUT_文件号

    那样的话 SSL_set_fd() 无法使用,您可以使用两个BIOs:

       // 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() . 但那只是一个例子。