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

2019-09-22 10:42发布

我们同时运行两个程序一个(Linux)的服务器,A和B目前,在客户中树立处理A,然后通过所产生的socket的文件描述符进程B的连接,使进程B使用现有的FD /插座进行无缝通信与客户端。 客户端和进程B然后执行TLS握手,并继续将所得的TLS连接通话。

(我在这里留下了大量的细节,但肯定的, 存在对于具有进程A充当一个中介一个很好的理由,而不是只连接到直接处理B)

现在因为<long complicated story involving new client applications and websockets>看起来我们可能需要执行过程中的一个TLS握手,然后转移建立的TLS连接来处理B.

那可能吗? 基础套接字的文件描述符可以被复制(我们这样做的话),并且至少在理论上,内部TLS状态数据也可以被复制并用于重建的进程B的TLS连接,有效地接管连接。

但公开的OpenSSL像任何设施? 我发现功能d2i_SSL_SESSION这似乎做的OpenSSL的会话对象类似的东西,但是是很新的OpenSSL的,我不知道这是足够的。 有会议,背景,生物的和一堆其他涉案复杂的冠冕堂皇的条款。 多少钱必须被序列化并转移到进程B的这个工作? 而如何将其在实践中做了什么?

切换需要为100%对客户端透明的:它必须简单地执行针对给定的IP /端口SSL握手,然后继续通话所得插座上,没有知识的事实,即一个进程接受连接并进行TLS握手,而另一个则处理所有后续通信。

Answer 1:

跨进程共享SSL环境确实是可能的。 然而,随后的SSL会话的上下文需要驻留在共享存储位置是都可以访问的过程(因为对于具体原因不详),我们希望实际的握手过程一完成,并做数据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

为了(德)序列化SSL_SESSION 'C' 结构利用现有的API d2i_SSL_SESSION(...)和i2d_SSL_SESSION(...)

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



Answer 2:

我还没有试过这种实践,但据我记得套接字级别的创建连接后,其OpenSSL的初始化,然后你阅读SSL_read和SSL_write /写。 他们接受套接字fd为参数。 连接本身(从SSL侧)被表示与SSL_CTX SSL结构。

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



Answer 3:

最近的内核补丁可以使人们有可能通过提供一个正常的FD的TLS连接。 请参阅“页面在内核由杰克边缘2015年12月2日TLS ”。 我还张贴交叉到另一个SO问题 。



Answer 4:

我不认为这是可能的,因为初始握手的一部分是密钥交换和密钥都需要不断的沟通。 方法B将需要知道密钥正在使用的远端和由过程A.



Answer 5:

听起来像这样比较麻烦,这是值得...考虑其他的设计,例如通过代理一个代表例如使用loopback接口B的连接。



文章来源: OpenSSL: accept TLS connection and then transfer to another process