如何以新的方式编写线程安全的OpenSSL代码?

4

我正在学习如何使用OpenSSL编写多线程DTLS服务器。我一直在查阅文档,看起来如果我设置CRYPTO_set_id_callbackCRYPTO_set_locking_callback,OpenSSL应该可以与多个线程一起工作。我正在使用OpenSSL 1.1.1c,在查看crypto.h时,发现了以下内容:

/*
 * The old locking functions have been removed completely without compatibility
 * macros. This is because the old functions either could not properly report
 * errors, or the returned error values were not clearly documented.
 * Replacing the locking functions with no-ops would cause race condition
 * issues in the affected applications. It is far better for them to fail at
 * compile time.
 * On the other hand, the locking callbacks are no longer used.  Consequently,
 * the callback management functions can be safely replaced with no-op macros.
 */
#  define CRYPTO_num_locks()            (1)
#  define CRYPTO_set_locking_callback(func)
#  define CRYPTO_get_locking_callback()         (NULL)
#  define CRYPTO_set_add_lock_callback(func)
#  define CRYPTO_get_add_lock_callback()        (NULL)

看起来这种方法已经过时了。我应该怎么做才能确保我的OpenSSL代码是线程安全的?
--
进一步研究后,我找到了这个:使用pthread的OpenSSL教程。我还发现了https://www.openssl.org/docs/man1.0.2/man3/CRYPTO_THREADID_set_callback.html。然而,CRYPTO_THREADID_set_callback()也是一个空操作!看来我除了用正确的标志编译OpenSSL之外无能为力了。

嗯,你是什么意思?我不打算重新编写openssl的部分...我只是用线程和zlib编译最新版本。这些“专业实现”的例子有哪些? - Rotartsi
1个回答

2
实际上,在OpenSSL 1.1.0及更高版本中,您不再需要设置锁。
使用OpenSSL编程时,OpenSSL是线程安全的吗?
是的,但有一些限制;例如,SSL连接不能被多个线程同时使用。这对大多数OpenSSL对象都是正确的。
对于1.1.0及更高版本,您无需执行任何其他操作。
对于早于1.1.0版本的应用程序,需要设置线程回调函数。为此,您的应用程序必须调用CRYPTO_set_locking_callback(3)和其中一个CRYPTO_THREADID_set... API。有关详细信息,请参见OpenSSL线程手册和源分发中INSTALL文件中的“多线程注意事项”注释。
您可以在此处查看OpenSSL常见问题解答!

是的。我刚刚用 ./config --release threads 编译了 OpenSSL 并继续进行了下一步。 :) - Rotartsi
1
对于版本1.1.0及更高版本,您无需进行任何进一步的操作。这是否意味着在openssl中有互斥量?或者只有在编译时使用互斥量? - user997112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接