- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 openssl 库打开到某个服务器的 TLS 连接。阅读库文档(是的,有些人仍在阅读文档和手册页)我偶然发现了句子“SSL_libary_init() is not reentrant”。
我一般理解什么是不可重入函数:即某些函数保持内部状态,同时调用它两次或在执行时中断它可能会导致困惑(函数不执行调用者的操作正在期待)。
但在 SSL_library_init() 的特定情况下,我想知道它的实际含义。
这是否意味着如果在调用 SSL_library_init() 时发生某些中断,它将无法正确初始化 SSL 库?因此,我是否应该在调用它之前禁用所有可访问的中断并在之后重新启用所需的中断?
这是否意味着它是线程不安全的,我应该确保两个线程不能同时调用它? (看起来很有可能,即使线程安全并不完全等同于可重入)。
这是否意味着我不应该在程序生命周期中调用它两次,或者在 SSL 连接打开时调用它会造成严重破坏?
因为我正在开发一个代理,一端是客户端,另一端是服务器,两端都可能使用 TLS 服务,(但我也可能只是一端,或者什么都没有)。我应该将 SSL 库作为系统范围的单例来管理吗?如果是这种情况,它很容易管理,但据我所知,这不完全是一个重入问题。
我不知道应该只调用一次的函数的简称...
我对 SSL_CTX_new() 也有类似的问题。文档指出每个程序生命周期只能调用一次。这很烦人,因为它似乎限制服务器和客户端(或在同一进程中运行的几个独立服务器或客户端实例)使用相同的 SSL_METHOD 并且感觉不对,但我仍然希望在这种情况下它只是一些文档不准确.
有没有人有足够的 openSSL 经验来解释我应该或不应该对 OpenSSL 初始化代码做什么以保持安全?
最佳答案
我可以根据我所看到的给你一个提示。我有一个 CentOS 7/Django 1.9.3/Apache 2.4/mod_ssl/Python 3.4 网络服务器,它接收来自用户的 https: 连接。在处理请求时,服务器需要向后端查询满足请求所需的信息。后端查询在独立运行时工作正常,但它会生成:
OSError(0, 'Error')
Line 810, /lib64/python3.4/ssl.py
803 def do_handshake(self, block=False):
804 """Perform a TLS/SSL handshake."""
805 self._check_connected()
806 timeout = self.gettimeout()
807 try:
808 if timeout == 0.0 and block:
809 self.settimeout(None)
810 self._sslobj.do_handshake() # <<<-------
在 Apache WSGI 上下文中运行时。
如果实际上是 mod_ssl 导致了我的错误,这意味着该库是线程安全的(因为 Apache 当然可以同时处理多个 Web 请求)但不可重入(因为 SSL 不能使用两次——例如用于前端和后端连接——在一个线程中)。
当然,两层 Web 服务器是一种成熟的设计模式,因此必须有一个解决方法。感谢您发布有关不可重入的信息 - 这是我发现的第一个线索,可能是我遇到问题的原因。
作为引用,我的代码调用了一个 RESTful 服务,该服务采用从 SSL_CLIENT_CERT 中提取的用户专有名称并以 JSON 格式返回用户属性:
import requests, urllib
URL = 'https://example.com/rest/user_info/'
def get_user_info(dn)
query = URL + urllib.parse.quote(dn)
return requests.get(query, cert=('server.crt', 'server.key'), verify='ca_bundle.crt').json()
当从 Web 服务器上的命令行(在 WSGI 目录中作为用户 apache)运行时,该代码完美运行,但当由 Apache 本身调用时会崩溃。
关于c - SSL_library_init 出于实际目的不可重入是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15687180/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!