OpenSSL C API:如何在程序exec()之后恢复TLS连接?

时间:2018-09-30 10:26:39

标签: c++ c ssl openssl libssl

所以,这是我的难题,我正在研究C ++中的自我更新机制,但我不知道如何让OpenSSL接受先前版本中已初始化的int套接字,并重新协商连接。 我已经尝试SSL_connect()SSL_renegotiate可以再次使用的{@ 1}}机会,但是我什么都做不了。

我想这是因为OpenSSL不知道套接字已被设置为TLS,但是我怎么知道呢?

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

有关更多信息,请参见Kernel TLS documentation

答案 1 :(得分:1)

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

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

另一种方法是在执行SSL_shutdown之前显式关闭与exec的SSL会话,并在新过程中与SSL_connect在同一TCP连接上创建一个新的SSL会话。当然,这需要将其降级到纯TCP,再升级到TLS也需要在TCP连接的另一端得到支持。