【发布时间】:2017-01-30 20:58:12
【问题描述】:
我在 Linux 上使用 OpenSSL 1.0.0-fips。我遇到的问题是SSL_connect() 返回-1,SSL_get_error() 返回SSL_ERROR_WANT_READ。然后我将文件描述符放入select() 中,timeval 结构设置为 10 秒,select() 只是超时。
我启动了 Wireshark,我看到“Client Hello”消失了,我看到 ServerHello 返回到客户端,但它从未在 select() 中“唤醒”。它只是超时。
我的问题是:
是否必须使用
BIO_new_socket()创建 BIO 对象,然后使用SSL_set_bio()将 BIO 对象分配给我的 SSL 对象?SSL_set_fd()的手册页说它将自动创建一个 BIO 对象,因此这似乎暗示SSL_set_bio()是一种你永远不必真正调用的无用函数。假设我们使用
SSL_set_fd()并分配一个已连接的阻塞TCP 文件描述符。假设我们稍后使用fcntl()将该文件描述符更改为非阻塞。这是否会破坏 SSL 对象(或底层 BIO 对象)?
【问题讨论】:
-
您可能应该展示一些代码,包括您如何设置上下文。异步 I/O 和非阻塞套接字给人们带来了相当多的麻烦,因为库不太适应。查看
apps/ocsp.c的源代码,了解 OpenSSL 是如何做到的。我似乎记得一个正常的上下文是在阻塞模式下设置的,然后使用底层套接字切换到非阻塞模式。搜索调用BIO_get_fd和select的代码。 AFAIK,它是自记录代码中非阻塞 I/O 的唯一示例 :) -
我没有发布代码,因为我实现的 C++ SSL Socket 类的整个连接函数非常大。但是,我发现了我的问题。我忘记在 select() 的 maxfd 参数中加 1。