【问题标题】:Using OpenSSL without threads在没有线程的情况下使用 OpenSSL
【发布时间】:2010-11-05 08:39:24
【问题描述】:

每当我在 Windows 或 Mac 上使用 OpenSSL 时,我总是制作自己的内存 BIO,并将它们链接到基于平台消息的(异步非阻塞)套接字实现。 (Windows 上的 WSAAsyncSelect:Mac 上的 CFSocket)

Secure programming with the OpenSSL API 托管在 ibm.com 上似乎是实现 OpenSSL 的最佳参考 - 但它实现了一个非常简单的阻塞连接。

是否有一种标准方法来设置和使用带有非阻塞套接字的 OpenSSL - 例如,如果没有数据,对 SSL_read 的调用不会阻塞?

【问题讨论】:

    标签: windows macos sockets openssl


    【解决方案1】:

    SSL_read()(和其他 SSL 函数)如果底层套接字设置为非阻塞,则可以正常工作。如果可用数据不足,则返回小于零的值;在返回值上调用SSL_get_error()会返回SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE,表示SSL正在等待什么。

    【讨论】:

    • 所以我需要 SSL_get_fd() 并将其设置为非阻塞?
    • @Chris Becke:在将套接字传递给SSL_set_fd() 之前,我总是将其设置为非阻塞。如果您使用 BIO,您可以使用 BIO_set_nbio() 将您的 BIO 设置为非阻塞。
    【解决方案2】:

    BIO_set_nbioBIO_new_socketBIO_new_connect/accept 一起使用可能比创建内存BIO 的代码更少。不知道有没有比这更标准的。文档对此进行了更详细的解释:

    http://www.openssl.org/docs/crypto/BIO_s_connect.html

    【讨论】:

    • BIO_new_connect 绝对是使用 OpenSSL 创建 SSL 套接字的规范方法。我的查询集中在:将 OpenSSL 套接字合并到 SSL_read 不得阻塞的程序中的最佳实践/最省力的方法是什么。
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多