我花了相当多的时间研究如何解决这个问题,但还没有找到可行的解决方案。
问题: 我正在使用 OpenSSL 库和 linux。我有一个服务器进程 P1 接受来自 SSL 客户端的 SSL 连接。P1 执行 tcp_accept() 然后 SSL_accept() 并使用 SSL_read/SSL_write() 与客户端交换一些协议数据。到目前为止一切都很好。现在按照设计,P1 需要分叉一个子进程 C1 来为客户端提供服务。C1 使用 execve 调用来重新映像自身并生成不同的二进制文件。C1 仍然需要通过在 P1 中使用的相同 SSL 连接与 SSL 客户端通信。问题是因为 C1 是一个完全不同的过程,现在它如何为该客户端重新使用现有的 SSL 连接?我能够将底层 TCP 套接字描述符从 P1 传递到 C1,因为它在内核中维护,但我无法传递 SSL 上下文,因为它在 Openssl 库中维护。
我在 stackoverflow 上看到了这个步骤,但不幸的是没有提到解决方案。 OpenSSL:接受 TLS 连接,然后转移到另一个进程
可能的解决方案: 我不确定是否有人已经解决了此类问题,但我尝试了以下操作。
我以为我可以创建一个新的 SSL 上下文并在新的子进程中进行 SSL 重新协商。因此,在 C1 中,我在相同的底层 tcp 套接字 fd 上创建了一个新的 SSL 上下文,并尝试进行 SSL 重新协商。这是我所做的(省略 SSL_ctx 初始化部分)
ssl = SSL_new(ctx) // ctx 的初始化与在 P1 服务器中完成的相同
SSL_set_fd(ssl, fd); …