将连接的 SSL 套接字传递给另一个进程

Pass connected SSL Socket to another Process

我正在努力寻找一种机制来向目标服务器发送请求,当套接字有数据要读取时,将套接字传递给另一个进程以获取数据。 到目前为止,我在 Linux 上使用 epoll 来实现它,直到我进行握手,我发送请求并且请求到达,然后我将套接字 fd 传递给另一个进程以进行进一步处理,我明确保存使用 PEM_write_bio_SSL_SESSION 的 SSL 会话,然后使用 PEM_read_bio_SSL_SESSION 读取它并将其添加到上下文中,但我无法在另一个进程中读取 ssl 套接字,因为我遇到内部错误或握手失败。

我读过这个 article 但仍然找不到任何机制来解决它。我知道这是因为 openssl 是应用程序级库,但必须有办法,因为 Apache 已经在这样做了。

至少,如果不可能的话,有没有办法使用来自 openssl 会话的主密钥从套接字(我可以正常读取)解密数据?

唯一的方法是克隆 SSL 套接字的完整用户 space 部分,它分布在多个内部数据结构中。由于您无权访问 python 中的所有结构,因此您只能通过克隆过程来做到这一点,即使用 fork

请注意,一旦您分叉了进程,您应该只在其中一个进程中继续使用 SSL 套接字,即不可能分叉,在子进程中做一些工作,然后在子进程中做一些工作父进程。这是不可能的,因为一旦您处理套接字,SSL 状态就会发生变化,但只会在其中一个进程中发生变化。在另一个进程中,状态不同步,以后任何使用这个错误状态的尝试都会导致奇怪的错误。