Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenSSL C API:如何在program exec()之后恢复TLS连接? 所以,这是我的困境,我正在研究C++中的自我更新机制,我无法理解如何让OpenSSL接受先前版本中已经初始化的int socket,并重新协商连接。 我已经尝试了SSL\u connect(),希望能再次成功,SSL\u重新协商和SSL\u do\u handshake(),但我什么都做不到_C++_C_Ssl_Openssl_Libssl - Fatal编程技术网

OpenSSL C API:如何在program exec()之后恢复TLS连接? 所以,这是我的困境,我正在研究C++中的自我更新机制,我无法理解如何让OpenSSL接受先前版本中已经初始化的int socket,并重新协商连接。 我已经尝试了SSL\u connect(),希望能再次成功,SSL\u重新协商和SSL\u do\u handshake(),但我什么都做不到

OpenSSL C API:如何在program exec()之后恢复TLS连接? 所以,这是我的困境,我正在研究C++中的自我更新机制,我无法理解如何让OpenSSL接受先前版本中已经初始化的int socket,并重新协商连接。 我已经尝试了SSL\u connect(),希望能再次成功,SSL\u重新协商和SSL\u do\u handshake(),但我什么都做不到,c++,c,ssl,openssl,libssl,C++,C,Ssl,Openssl,Libssl,我想这是因为OpenSSL不知道套接字已经设置为TLS,但我该如何告诉它呢 总之,在通过exec*()函数从同一程序的早期版本继承原始“int”套接字描述符之后,我正在尝试重新建立TLS连接 谢谢。OpenSSL套接字中已建立的SSL包含用户空间SSL状态。执行exec时,由于上一个进程的内存被新进程替换,因此该状态将丢失。虽然理论上可以在一个进程中序列化完整的SSL状态并在新进程中取消序列化,但我认为没有一个OpenSSL API可以做到这一点。它也可能不是简单地通过保存和恢复一些内存块来完成

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

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


谢谢。

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

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


另一种方法是在执行
exec
并在新流程中使用
SSL\u connect
在同一TCP连接上创建新的SSL会话之前,使用
SSL\u shutdown
显式关闭SSL会话。当然,这需要降级到普通TCP,再次升级到TLS也需要TCP连接另一端的支持。

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


有关更多信息,请参阅。

我曾经研究过这个问题,但找不到解决办法。最后编写了一个代理进程,该进程使用unix套接字在SSL连接和执行实际工作的进程之间传输数据。请问,为什么父进程不能向子进程传递足够的信息来建立自己的连接?父母知道什么孩子不知道?或者如果你用叉子叉孩子,也许它继承了足够多的状态……fork如何进行自我更新?@Yakk AdamNevraumont:我不确定您的具体用例是如何工作的,但如果使用相同的TCP连接真的很重要,您可能需要在您的自我更新应用程序周围有一些包装程序,它关心通信。除此之外,我不知道为什么首先需要更新的进程使用完全相同的TCP/TLS连接。