所以,这是我的难题,我正在研究C ++中的自我更新机制,但我不知道如何让OpenSSL接受先前版本中已初始化的int套接字,并重新协商连接。
我已经尝试SSL_connect()
和SSL_renegotiate
可以再次使用的{@ 1}}机会,但是我什么都做不了。
我想这是因为OpenSSL不知道套接字已被设置为TLS,但是我怎么知道呢?
总而言之,在通过exec *()函数从同一程序的先前版本继承了原始的“ int”套接字描述符之后,我试图重新建立TLS连接。
谢谢。
答案 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连接的另一端得到支持。