【发布时间】:2020-03-11 07:36:29
【问题描述】:
我正在使用一个模拟 Berkeley 套接字 API 的传输库来使用它(包括阻塞和非阻塞模式)。需要给我发送的数据加上TLS加密,可以想到两种方法:
自定义 BIO:找到了 Socket BIO 的代码,因此考虑制作一个副本并将所有 berkeley 套接字调用替换为该库的函数。但是,我在网上找不到太多关于自定义 BIO 的信息,所以要小心我在没有得到太多帮助的情况下会遇到的陷阱。
Memory BIO:这种方法有更多的追随者,也有不少例子。虽然,大多数人警告说,具有非阻塞套接字的内存 BIO 比阻塞路由复杂一个数量级。
关于内存 BIO 方法,我看到的源代码对我来说很有意义,但它是一个简单的回显客户端/服务器。让我很困惑的是当 SSL_Read/SSL_Write 返回 SSL_WANT_READ 或 SSL_WANT_WRITE 时该怎么办。我的理解是,在 Blocking Socket BIO 的情况下,您只需稍后重试调用,因为底层代码会处理这些事情。
如果是内存 BIO + 非阻塞套接字,例如如果 SSL_Read 返回 SSL_WANT_WRITE,这是否意味着我的代码应该从输出 BIO (BIO_read) 中读取并将其发送到套接字,并且在原始 SSL_Read 调用成功之前不允许任何 SSL_Read/SSL_Write?在此期间允许 SSL_Write 可以吗?
编辑:我将专门使用 TLS 1.3,只是发现它不支持重新协商。这是否意味着一旦建立连接,我就不必担心 SSL_Read 上的 WANT_WRITE 和 SSL_Write 上的 WANT_READ 了?
【问题讨论】:
标签: openssl