共享内存 (SHM) 中的 OpenSSL 会话池可能吗? [关闭]

Posted

技术标签:

【中文标题】共享内存 (SHM) 中的 OpenSSL 会话池可能吗? [关闭]【英文标题】:OpenSSL session pool in shared memory (SHM) possible? [closed] 【发布时间】:2016-12-25 17:48:30 【问题描述】:

我想在 SHM 中创建一个 TLS 连接/会话池,以便我可以在多个进程中使用 TLS 连接(当然不能同时使用)。

我确实在旧论坛帖子上读到这是不可能的,但在接近 2017 年时,情况仍然如此,还是现在有一种方法可以将 SSL 处理程序以及 TLS 会话创建和需要的任何内容放入 SHM?

我正在 Linux 上使用 C 或 C++ 进行开发。

编辑:暂停,因为基于意见。你能解释一下问题中表达的观点吗?

谢谢

【问题讨论】:

没有语言 C/C++。只有两种不同语言 C 和 C++。您应该首先决定使用和询问哪一个。 即使有可能,从安全角度来看,这听起来也是一个非常糟糕的主意。如果您不是专家,请不要摆弄与安全相关的东西(而且您不会问自己是否是专家)。 @Olaf :对不起,我应该说“C 或 C++”而不是“C/C++”,我在问题中更改了它 @Olaf :我正在编写一个客户端(不是服务器)仅供我使用,我不在乎我的计算机上由同一用户或 root 创建的另一个进程是否可以访问私钥TLS 会话。是的,我不是像你这样的 OpenSSL 专家,这就是我问这个问题的原因 确实这个问题可能过于宽泛,但不是基于意见的。 【参考方案1】:

是的,这是可能的。 Apache manages it just fine,例如。 So does nginx.(请注意,这里共享的是 TLS 会话,而不是连接本身。)

我不熟悉这是如何实现的,但是这两个应用程序都是开源的,所以你可以研究它们的源代码来找出答案。

【讨论】:

谢谢duskwuff,这是一个非常有用的回复!我在询问之前在谷歌搜索时看到了这个 Apache 选项,但我希望不必查看源代码!我不知道 nginx,但这对我来说是一个很好的信息来源 我怀疑他们添加来更改 OpenSSL 源代码以用于此用途,或者他们发现另一种方式暗示固定地址映射和覆盖 malloc 使用的动态库 (***.com/questions/5939578/…) @mikeDundee 你的怀疑是没有根据的。 Apache 和 nginx 链接到一个完全“库存”的 OpenSSL。 然后 OpenSSL 为我们提供了一种在 API 中执行此操作的方法,这可能是 Piyush Dewnani 在他的回答中描述的方式(使用 i2d_SSL_SESSION) 事实上他们正在使用 i2d_SSL_SESSION/d2i_SSL_SESSION : github.com/apache/httpd/…, github.com/nginx/nginx/…【参考方案2】:

确实可以跨进程共享 SSL 上下文,但 SSL-session-context 需要驻留在(工作)进程可访问的共享内存位置中。

第一步是注册回调:

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-context(或至少返回一个序列化并准备使用指向SSL_SESSION 的可寻址指针。

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

github 上提供了使用此方法的示例代码。

【讨论】:

谢谢,这是OpenSSL提供的一种跨进程传输TLS会话数据的方式!您是否认为每次发生 TLS 重新协商时我们都必须对其进行序列化/反序列化并在所有进程之间传输它?共享内存中不可能有一个上下文? @mikeDundee AFAIK TLS 会话数据(上下文)必须在共享内存中,上述方法可以让您基于会话获得适当的会话上下文(已经在共享内存中) -OpenSSL api通过SSL_CTX_sess_set_get_cb(ctx, shared_ctx_get_cb);注册的tp函数的id【参考方案3】:

不要。 2 个原因

    文件描述符(在底层套接字中使用)不能在进程之间共享。 OpenSSH 使用了很多指针。共享的物理物理内存可能有不同的虚拟地址。这意味着一个进程中的指针将指向另一个进程中的错误位置。因此,在使用共享内存时,您需要使用偏移量。

【讨论】:

是的,我知道我必须使用偏移量来将指针存储在共享内存中,我已经使用它们了。但我在问现在是否有一种方法可以将内存段(如 boost 内存段)传递给 OpenSSL,以便它可以使用这个内存池来分配数据,或者其他方式...... 似乎可以在进程之间共享文件描述符:***.com/questions/2358684/… OpenSSL 本身不使用偏移量并广泛使用指针,因此无需重写 opessl,此操作系统是不可能的。 您可以通过 unix 套接字传递文件描述符,但这需要内核支持 fd。这不能天真地做到。 @doron :如果您查看我提供的链接,我不认为他们只是传递文件描述符整数值

以上是关于共享内存 (SHM) 中的 OpenSSL 会话池可能吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我们在哪里调用“Shm_unlink()”

为啥我可以使用 POSIX 创建比 /dev/shm 上安装的大小更大的共享内存?

System V 共享内存区

与 emscripten 共享内存 ('sys/shm.h')

共享内存 设计原理-shm

df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件