我们有一个(Linux)服务器运行两个进程,A 和 B。目前,客户端与进程 A 建立连接,然后将生成的套接字的文件描述符传递给进程 B,允许进程 B 使用现有的 fd/socket 进行无缝通信与客户。客户端和进程 B 然后执行 TLS 握手并继续在生成的 TLS 连接上进行交谈。
(我在这里省略了很多细节,但是是的,有充分的理由让进程 A 充当中介而不是直接连接到进程 B)
现在,因为<long complicated story involving new client applications and websockets>
看起来我们可能必须在进程 A 中执行 TLS 握手,然后将已建立的 TLS 连接传输到进程 B。
那可能吗?底层套接字的文件描述符可以被复制(我们已经这样做了),并且至少在理论上,内部 TLS 状态数据也可以被复制并用于重建进程 B 中的 TLS 连接,从而有效地接管连接。
但是 OpenSSL 是否公开了任何类似的设施?我发现这个函数d2i_SSL_SESSION
似乎对 OpenSSL 会话对象做了类似的事情,但是对于 OpenSSL 来说还是很新的,我不确定这是否足够。涉及会话、上下文、BIO 和一堆其他听起来很复杂的术语。有多少需要序列化并转移到流程 B 才能工作?以及如何在实践中完成?
切换需要对客户端 100% 透明:它必须简单地对给定的 IP/端口执行 SSL 握手,然后继续在生成的套接字上进行通信,而不知道一个进程接受连接并执行TLS 握手,然后另一个处理所有后续通信。