在 OpenSSL 上使用 BIO 和 SSL 函数之间的混淆

Confusion between using BIO and SSL functions on OpenSSL

提问人:learning_frog 提问时间:9/7/2016 最后编辑:Communitylearning_frog 更新时间:9/7/2016 访问量:3552

问:

我必须使用 OpenSSL 来保护现有的套接字客户端连接,以替换 、 、 函数。
但我对SSLBIO功能的使用不太满意。
我知道这里和这里都有一些关于它的质疑,但我仍然不清楚它们之间的确切区别。 谁能帮我理解它们之间的确切关系(1)?
connectsendreceiveclose

OpenSSL 文档总是将 BIO 称为底层结构,但没有关于该主题的进一步解释。 据我了解,任何对 的调用也会写入 BIO,可以处理或不处理。
执行 a 或 a 向套接字 (2) 发送数据有什么区别吗?
如果不是,在我的案例中,使用 BIO 功能有什么好处 (3)?有(4)吗?
SSL_writeBIO_writeSSL_write

在这里这里找到了一些关于SSL客户端的有用示例。 第一个混淆了 BIOSSL 函数的使用,例如使用 而不是 .可以吗(5)?SSL_do_handshakeBIO_do_handshake

由于 BIOSSL 功能的基础,我是否应该避免使用它 (6)?

C 套接字 SSL openSSL

评论

7赞 Remy Lebeau 9/7/2016
SSL API 位于 BIO API 之上。默认情况下,SSL API 使用套接字 BIO 为您处理所有套接字 I/O,这需要您重新编写现有的代码逻辑,即使用 / 而不是 /。如果要执行自己的 I/O,可以创建几个内存 BIO 对,并将它们链接到 SSL 会话。这样,您收到的任何原始数据都可以被推送到一个 BIO 对中,并将解密它从中读取的内容,并将加密数据推送到另一个 BIO 对中,然后您可以发送从中读取的任何内容。SSL_recv()SSL_write()recv()send()SSL_set_bio()SSL_recv()SSL_write()
1赞 learning_frog 9/7/2016
那么,如果我只想通过套接字发送/接收,我不需要使用BIO功能吗?SSL功能就足够了吗?
3赞 Remy Lebeau 9/7/2016
换言之,如果将 BIO API 与 SSL API 结合使用,则可以使用所选的 I/O API 保留现有的套接字 I/O 逻辑,同时仍在其上添加 SSL 加密/解密。否则,您必须重新编写套接字逻辑,以使用单独的 I/O API 拆分加密和非加密的套接字处理,这并不总是可取的(尤其是在读取和错误处理方面(特别是因为 OpenSSL 的工作方式往往与套接字开发人员传统上被教导管理套接字 I/O 的方式相反)。
1赞 Remy Lebeau 9/7/2016
您根本不需要直接使用 BIO API,但在适用时它是首选。这实际上取决于您现有的套接字代码库,以及您希望投入多少精力来重写它以使其支持 SSL。
5赞 Remy Lebeau 9/7/2016
我说过,这取决于你根据你的代码库和所需的努力程度来决定。你可以走任何一种方式。SSL API 本身使用起来更简单一些,但确实与传统的套接字 API 有一些不同的语义(例如,在非阻塞模式下,在 OpenSSL 要求你先调用之前不要调用 /,而在传统 API 中,你会调用 / when / 告诉你它没问题)。另一方面,BIO API 使用起来需要做更多工作,但它在处理 I/O 操作的方式上提供了更大的灵活性。select()poll()recv()send()select()poll()

答: 暂无答案