我正在使用 openssl 库打开与某个服务器的 TLS 连接。阅读库文档(是的,有些人仍然阅读文档和手册页)我偶然发现了“SSL_libary_init() 不是可重入的”这句话。
我一般理解什么是不可重入函数:即某些函数以这样的方式保持内部状态,即同时调用它两次或在执行时中断它可能会导致混乱(该函数没有按照调用者的期望执行) .
但在 SSL_library_init() 的特定情况下,我想知道它的实际含义。
这是否意味着如果在调用 SSL_library_init() 时发生某些中断,它将无法正确初始化 SSL 库?因此,我是否应该在调用它之前禁用所有可访问的中断并重新启用所需的中断?
这是否意味着它是线程不安全的,并且我应该确保两个线程不能同时调用它?(看起来很可能,即使线程安全并不完全意味着与可重入相同)。
这是否意味着我不应该在程序生命周期内调用它两次,或者在 SSL 连接打开时调用它会造成严重破坏?
由于我正在使用一端作为客户端,另一端作为服务器的代理,因此两端都可能使用 TLS 服务(但我也可能只是一端,或者没有)。我应该将 SSL 库作为系统范围的单例来管理吗?如果是这种情况,那么管理起来很容易,但正如我所理解的那样,这并不完全是一个可重入问题。
我不知道应该只调用一次的函数的简称...
对于 SSL_CTX_new(),我也有类似的问题。文档指出每个程序生命周期只能调用一次。这很烦人,因为它似乎限制服务器和客户端(或在同一进程中运行的多个独立服务器或客户端实例)使用相同的 SSL_METHOD 并且感觉不对,但我仍然希望在这种情况下它只是一些文档不准确.
有没有人有足够的 openSSL 经验来解释我应该或不应该对 OpenSSL 初始化代码做什么以保持安全?