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

Python 将连接的SSL套接字传递给另一个进程,python,network-programming,openssl,m2crypto,Python,Network Programming,Openssl,M2crypto,我正在努力寻找一种机制来向目标服务器发送请求,当套接字有数据要读取时,将套接字传递给另一个进程以获取数据。 到目前为止,我在Linux上使用epoll实现它,我进行握手,发送请求,请求到达,然后将套接字fd传递给另一个进程进行进一步处理,我使用PEM_write_bio_SSL_Session显式保存SSL会话,然后使用PEM_read_bio_SSL_Session读取SSL会话,并将其添加到上下文中,但我无法在另一个进程中读取SSL套接字,因为我遇到内部错误或握手失败 我读过这篇文章,但仍然

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

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


至少,如果不可能,是否有一种方法可以使用openssl会话中的主密钥从套接字(我可以正常读取)解密数据

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


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

谢谢您的回答。我希望能找到一种方法,不去岔开这个过程,因为这对我所做的事情来说是非常昂贵的。我理解这一点,有没有一种方法可以使用从SSL会话获得的信息来手动删除数据?我可以从套接字读取所有加密的数据。据我所知,您唯一的选择是分叉进程。当前SSL状态没有序列化,因此您可以传输它。请注意,SSL会话不是内部SSL状态。您是对的,我只是重复使用SSL会话,这降低了握手的开销,但这绝对不是将套接字句柄提供给另一个进程的方法。我尝试了posix线程,效果很好。仍然对性能持悲观态度,希望通过pthread内部的协作调度获得更好的性能。我想知道Apache是如何做到这一点的,我将看看它们的实现。