我们同时运行两个程序一个(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握手,而另一个则处理所有后续通信。
跨进程共享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
我还没有试过这种实践,但据我记得套接字级别的创建连接后,其OpenSSL的初始化,然后你阅读SSL_read和SSL_write /写。 他们接受套接字fd为参数。 连接本身(从SSL侧)被表示与SSL_CTX SSL结构。
因此,在理论上听起来可能,但正如我说我从来没有尝试过在现实世界中。
最近的内核补丁可以使人们有可能通过提供一个正常的FD的TLS连接。 请参阅“页面在内核由杰克边缘2015年12月2日TLS ”。 我还张贴交叉到另一个SO问题 。
我不认为这是可能的,因为初始握手的一部分是密钥交换和密钥都需要不断的沟通。 方法B将需要知道密钥正在使用的远端和由过程A.
听起来像这样比较麻烦,这是值得...考虑其他的设计,例如通过代理一个代表例如使用loopback接口B的连接。