OpenSSL:接受TLS连接,然后转移到另一个进程

我们有一个运行两个进程A和B的(Linux)服务器。当前,客户端build立到进程A的连接,然后把结果的套接字的文件描述符传递给进程B,允许进程B使用现有的fd /套接口进行无缝通信与客户。 然后,客户端和进程B执行TLS握手,并继续通过生成的TLS连接进行通信。

(我在这里遗漏了很多细节,但是是的,有一个很好的理由让stream程A充当中介,而不是直接连接到stream程B)

现在,由于<long complicated story involving new client applications and websockets> ,看起来我们可能必须在进程A中执行TLS握手,然后将已build立的TLS连接传输到进程B.

那可能吗? 底层套接字的文件描述符可以被复制(我们已经这样做了),至less在理论上,内部TLS状态数据也可以被复制并用于在过程B中重buildTLS连接,有效地接pipe连接。

但是OpenSSL是否暴露了这样的设施? 我发现函数d2i_SSL_SESSION似乎为OpenSSL会话对象做了类似的事情,但是对于OpenSSL来说是相当新的,我不确定这是否足够。 有会议,上下文,生物和一些其他复杂冠冕堂皇的条款涉及。 多less将不得不被序列化并转移到过程B为此工作? 而且在实践中怎么做呢?

切换对于客户端来说是100%透明的:它必须简单地对一个给定的IP /端口执行SSL握手,然后继续在所产生的套接字上通话,而不知道一个进程接受连接并执行TLS握手,然后另一个处理所有后续的通信。

Solutions Collecting From Web of "OpenSSL:接受TLS连接,然后转移到另一个进程"

我没有尝试过这个练习,但据我记得,在套接字级别上创建连接后,它由openssl初始化,然后用SSL_read和SSL_write读/写。 他们接受套接字fd作为参数。 连接本身(从SSL端)用SSL_CTX SSL结构表示。

所以理论上听起来可能,但正如我所说,我从来没有在现实世界中尝试过。

跨进程共享SSL上下文确实是可能的。 然而,SSL会话上下文将需要驻留在两个进程都可访问的共享内存位置(由于具体原因未知),我们希望实际握手在进程A中完成,并执行数据I / O在过程B中

第一步是注册回调SSL_CTX_sess_set_new_cb(ctx,shared_ctx_new_cb); SSL_CTX_sess_set_get_cb(ctx,shared_ctx_get_cb); SSL_CTX_sess_set_remove_cb(ctx,shared_ctx_remove_cb);

确保始终在共享内存中创建适当的SSL会话上下文(或者至少返回一个序列化并准备使用的可寻址指针到SSL_SESSION

使用可用的API d2i_SSL_SESSION(…)和i2d_SSL_SESSION(…)序列化SSL_SESSION“C”结构

使用此方法的工作项目示例代码https://github.com/varnish/hitch/blob/master/src/shctx.c

我不认为这是可能的,因为初始握手的一部分是密钥交换,并且正在进行的通信需要密钥。 进程B需要知道远端和进程A使用的密钥

听起来像更麻烦,它是值得的…考虑其他设计,例如通过使用回送接口代表B通过A代理连接。

最近的一个内核补丁可以通过为TLS连接提供一个正常的fd来实现。 请参阅“ Jake Edge 2015年12月2日内核中的TLS ”页面。 我也交叉发布到另一个SO问题 。