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

标签 c++ linux sockets openssl posix

我们有一个(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 session 对象做了类似的事情,但对 OpenSSL 来说是很新的,我不确定这是否足够。涉及 session 、上下文、BIO 和其他一些听起来很复杂的术语。有多少必须序列化并传输到进程 B 才能使其工作?在实践中将如何完成?

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

最佳答案

跨进程共享 SSL 上下文确实是可能的。然而,SSL-session-context 需要驻留在两个进程都可以访问的共享内存位置(因为具体原因未知)我们希望在进程 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 session 上下文(或至少返回一个序列化并准备好使用指向 SSL_SESSION 的可寻址指针

要(反)序列化 SSL_SESSION 'C' 结构,请使用可用的 API d2i_SSL_SESSION(...) 和 i2d_SSL_SESSION(...)

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

关于c++ - OpenSSL:接受TLS连接,然后转移到另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12426246/

相关文章:

c++使用自定义模板库对 vector 对进行排序

python - 从 Python 运行 bash 脚本

javascript - 自定义 firefox console.log(针对我自己的原型(prototype))

node.js - 在 mongodb 中保存未知 JS 对象的字符串表示

linux - Freepascal,Indy SVN 主干版本,PHP 客户端在传输 XML 时没有收到任何信息,直到删除编码转换

在没有 select() 的情况下检查 C 中的套接字是否断开连接

c++ - 将整个 ASCII 文件读入 C++ std::string

c++ - 使用MSVC在Windows上编译报错Botan库

c - sigwait后如何执行语句

c++ - MinGW 链接路径