对 OpenSSL 非阻塞 I/O 感到困惑

标签 c security ssl openssl nonblocking

一般来说,OpenSSL 库(C API)似乎提供了两种方法来完成所有事情:您可以使用根据您的喜好配置的普通系统套接字,或者您可以使用 OpenSSL BIO 对象,这些对象是有点像流。

但是,我经常对一些重复的功能感到困惑。例如,如何使 SSL 连接成为非阻塞的?一种方法似乎是简单地访问底层文件描述符并使用 fcntl 将其设置为非阻塞。但是还有一个名为 BIO_set_nbio 的 OpenSSL API 函数,它接受一个 BIO* 对象并将其设置为非阻塞模式。

那么设置非阻塞 SSL 套接字的最佳方法是什么?如果您向 OpenSSL 传递一个 native 文件描述符,该文件描述符已经通过 fnctl 设置为非阻塞模式,会发生什么情况?还需要专门调用BIO_set_nbioBIO对象成为非阻塞的吗?

最佳答案

我认为大多数人更喜欢 BIO 接口(interface),但 BIO 例程只使用平台上可用的任何 native 非阻塞套接字 API。我不知道如果混合搭配会发生什么。

请注意,SSL 的非阻塞 I/O 通常比 TCP 复杂很多。如果你不明白这是怎么回事,你就是在折磨自己。 John Viega 有书和另一个 Eric Rescorla进入这个,你当然可以阅读 OpenSSL 邮件列表来了解这引起的胃灼热。 TOR project 的软件中包含一些很好的代码示例,展示了使用 OpenSSL 进行非阻塞 SSL 编程。 , 和 curl效用。

关于对 OpenSSL 非阻塞 I/O 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397788/

相关文章:

ssl - 配置 WebSphere 8 SSL(应用程序之间的 HTTPS)

c - 在数字基数之间转换的递归函数在某些数字处失败

c - 为什么GCC使用mov/mfence而不是xchg来实现C11的atomic_store?

asp.net - 最佳实践 ASP.NET 成员资格 : User tables in the same datastore?

php - 我的 php "Remember me"系统安全/实用吗?

amazon-web-services - 使用 Lambda 集成保护 AWS API 网关

c - 使用 C 预处理器生成两个函数

c++ - 如何将结果存储到文本文件中?

java - java中的最大对象大小

ssl - 延长我机器的证书长度