gpt4 book ai didi

c++ - 使用 OpenSSL BIO 的非阻塞 I/O

转载 作者:太空狗 更新时间:2023-10-29 12:11:40 25 4
gpt4 key购买 nike

我在 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()< 中“唤醒”/。它只是超时。

我的问题是:

  1. 我是否必须使用 BIO_new_socket() 创建 BIO 对象,然后使用 SSL_set_bio() 将 BIO 对象分配给我的 SSL 对象? SSL_set_fd() 的手册页说它会自动创建一个 BIO 对象,这似乎暗示 SSL_set_bio() 是一种您永远不必真正使用的无用函数打电话。

  2. 假设我们使用 SSL_set_fd() 并分配一个阻塞的已连接 TCP 文件描述符。假设我们稍后使用 fcntl() 将该文件描述符更改为非阻塞。这是否会破坏 SSL 对象(或底层 BIO 对象)?

最佳答案

1) Do I have to create a BIO object using BIO_new_socket() and then assign the BIO object to my SSL object using SSL_set_bio()? The man page for SSL_set_fd() says it will automatically create a BIO object so that seems to imply that SSL_set_bio() is sort of a useless function that you never really have to call.

如果默认的 BIO 对象足以满足您的需要,那么您不必手动创建和安装自己的 BIO 对象。 SSL_set_bio() 调用是为了防止您想要创建/使用不同于 SSL_set_fd() 代表您创建的默认对象的 BIO 对象。

2) Let us say we use SSL_set_fd() and assign a connected TCP file descriptor that is blocking. Let us say that we then later change that file descriptor to non-blocking using fcntl(). Does this break the SSL object (or the underlying BIO object) in any way?

是的,我相信它会破裂。非阻塞 OpenSSL 的调用模式与用于阻塞 OpenSSL 的调用模式非常不同,我不相信您可以在运行中从一种模式来回切换到另一种模式。也就是说,我自己还没有尝试过,所以我可能是错的,但我认为为了安全起见(并且要保持一致)你应该预先选择你是想使用阻塞还是非阻塞 I/O 并在连接期间坚持使用它。

特别是手册页中的这句话:

The BIO and hence the SSL engine inherit the behaviour of fd.

... 建议 SSL 设置调用将检查您的 fd 的状态,并根据 fd 的阻塞/非阻塞状态在 BIO 和 SSL 对象中设置私有(private)变量。如果您随后“躲在 OpenSSL 的背后”并更改 fd 的行为,OpenSSL 的例程将不会预料到这一点,并且很可能会做错事并且无法正常工作。

关于c++ - 使用 OpenSSL BIO 的非阻塞 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41945296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com