1

所以,这是我的两难境地,我正在研究 C++ 中的自我更新机制,但我无法弄清楚如何让 OpenSSL 接受已经在先前版本中初始化的 int 套接字,并重新协商连接。我已经尝试过SSL_connect()再次起作用的机会,SSL_renegotiate并且SSL_do_handshake(),但我无法得到任何工作。

我想这是因为 OpenSSL 不知道套接字已经设置为 TLS,但是我该如何告诉它呢?

总之,在通过 exec*() 函数从同一程序的先前版本继承原始“int”套接字描述符后,我试图重新建立 TLS 连接。

谢谢。

4

2 回答 2

2

如果您的平台是 linux:从 Linux 4.13 开始,可以在内核空间中执行 TLS。如果切换到这种机制,SSL 状态将保存在内核空间的套接字中,因此您可以像处理未加密连接一样处理文件描述符;特别是您可以在您的子进程中使用它而无需额外的努力。

有关详细信息,请参阅内核 TLS 文档

于 2018-09-30T11:15:04.593 回答
1

OpenSSL 套接字中已建立的 SSL 包含用户空间 SSL 状态。当执行exec此状态时,由于前一个进程而丢失,其内存被新进程替换。虽然理论上可以在一个进程中以某种方式序列化完整的 SSL 状态并在新进程中反序列化它,但我认为没有 OpenSSL API 可以做到这一点。而且它可能也不能简单地通过保存和恢复一些内存块来完成,而是可能取决于进程的当前内存布局,这在新进程中是不同的。

新进程处理现有 SSL 状态的常用方法不是exec新进程,而是 fork现有进程和exec新进程作为子进程,然后使用原始(父)进程从子进程传输数据,该进程仍然具有已建立的 SSL 状态。

SSL_shutdown另一种方法是在执行此操作之前显式关闭 SSL 会话,并在新进程中在exec同一 TCP 连接上创建新的 SSL 会话。SSL_connect当然,这需要降级到普通 TCP 并再次升级到 TLS 也需要 TCP 连接另一端的支持。

于 2018-09-30T10:46:17.253 回答