多核机器上的 OpenSSL

标签 openssl c c++

我正在迈入 OpenSSL 库的第一步,感觉有点迷茫。我的机器是多线程(至强系列,如果有人需要信息可以分享更多)与 Linux 操作系统。

应用程序构建是 SSL 代理,因此我需要尽可能快地处理多个 TCP 流,这意味着我希望尽可能无锁地运行库。

crypto/crypto.h 里面看了一点之后,主要是在这个部分:

# ifndef OPENSSL_NO_LOCKING
#  ifndef CRYPTO_w_lock
#   define CRYPTO_w_lock(type)     \
        CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
#   define CRYPTO_w_unlock(type)   \
        CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
#   define CRYPTO_r_lock(type)     \
        CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__)
#   define CRYPTO_r_unlock(type)   \
        CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
#   define CRYPTO_add(addr,amount,type)    \
        CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
#  endif

我试图深入研究代码/API,但有点迷路了。我的问题是:

  • OpenSSL 库对多核/线程应用有哪些支持?
  • 库的哪些部分只能有一个实例(单例)?

最佳答案

What support does OpenSSL lib have for multi-core/thread applications?

支持多线程应用程序,但请注意,它并非“正常工作”——特别是,您必须 install some special callbacks这样 OpenSSL 将进行必要的序列化/锁定,否则您的程序将遇到竞争条件而无法正常工作。 (即使安装了回调,您仍希望将对任何特定 OpenSSL 套接字/连接的访问​​限制在单个线程内,即不要让两个线程在没有同步的情况下同时对同一连接的 OpenSSL 句柄执行操作)

What parts of the lib can have only one instance (singleton)?

好吧,锁定回调将(必然)只有一个实例,因为所有线程都使用它们来序列化临界区。

此外,SSL 库设置函数(SSL_load_error_strings()、SSL_library_init() 等)应该只在您的应用程序执行开始时调用(即在您生成任何线程之前),以及 SSL 库拆卸函数(如果有的话)应该只在任何生成的线程被加入()并丢弃之后被调用;这样您就可以避免任何可能的竞争条件,即线程尝试使用尚未完全构建或者已经部分或完全销毁的 OpenSSL 资源。

I want to run the lib as lock-less as possible.

好吧,您可能不太走运——OpenSSL 并不是为无锁运行而设计的;它的 session 使用共享的非只读数据结构,并且必须同步对这些数据结构的访问,否则将发生错误。我认为您能做的最好的事情就是将锁定回调用作 recommended并相信 OpenSSL 实现者持有锁的时间不会超过绝对必要的时间。如果这还不够,那么您可能不得不开始寻找不同的 SSL 库实现,或者考虑使用多进程而不是多线程。

关于多核机器上的 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388193/

相关文章:

c - 在 C 中检索数组的用户输入

c++ - 如何跨文件使用类静态变量

c - 如何从 C 中的 CURL 请求接收 JSON 对象?

c - 构建的库目录未添加到 libtool 包装器脚本中的 LD_LIBRARY_PATH

c++ - 没有进位标志的大整数加法

c++ - 如何使用 C++ 从网页中获取文本?

linux - 无法将 libCURL 与 OpenSSL 链接

php - SSL 错误 SSL3_GET_SERVER_CERTIFICATE :certificate verify failed

objective-c - 当我从 p12 文件中读取 nsdata 时提取身份

ruby-on-rails - SSL_connect returned=1 errno=0 state=SSLv3 读取服务器证书 B : certificate verify failed on Mac