Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
如何在TLS应用程序中复制SSL_CTX对象?_C_Linux_Ssl_Openssl - Fatal编程技术网

如何在TLS应用程序中复制SSL_CTX对象?

如何在TLS应用程序中复制SSL_CTX对象?,c,linux,ssl,openssl,C,Linux,Ssl,Openssl,我有一份申请。使用openssl实现TLS v1.2的c 应用程序应打开到使用同一版本TLS运行的远程服务器的多个远程连接。我有一套用于所有连接的密钥、证书和CA_证书 我需要分别为每个客户端维护SSL\u CTX对象。但是,我希望创建一个全局SSL\u CTX上下文对象,并为以下内容配置一次: SSL\u CTX\u set\u ecdh\u auto() SSL\u CTX\u使用\u证书\u文件() SL_CTX_使用私钥_文件() SSL_CTX_set_verify() SSL_CT

我有一份申请。使用openssl实现TLS v1.2的c

应用程序应打开到使用同一版本TLS运行的远程服务器的多个远程连接。我有一套用于所有连接的密钥、证书和CA_证书

我需要分别为每个客户端维护
SSL\u CTX
对象。但是,我希望创建一个全局
SSL\u CTX
上下文对象,并为以下内容配置一次:

  • SSL\u CTX\u set\u ecdh\u auto()
  • SSL\u CTX\u使用\u证书\u文件()
  • SL_CTX_使用私钥_文件()
  • SSL_CTX_set_verify()
  • SSL_CTX_设置_选项()
  • SSL\u CTX\u加载\u验证\u位置
  • SSL\u CTX\u设置\u验证\u深度()
然后,对于应用程序启动的每个连接,我可以复制(复制)上述配置的上下文ctx,并直接调用
SSL\u new()
,而无需为每个客户端反复执行列出的步骤

Openssl是否提供复制
SSL\u CTX
对象的功能?
如果没有,还有其他安全的方法吗?像
memcpy
()等
SSL\u CTX
有一个计数参考。这意味着当它的引用计数达到零时,它将被释放

因此,与其复制
SSL\u CTX
,不如通过
SSL\u CTX\u up\u ref()
增加其引用,并使用相同的对象。因此,您的代码如下所示:

SSL_CTX *g_ssl_ctx = nullptr;
//...
//init g_ssl_ctx 
//...
SSL_CTX *get_client_ctx() {
    SSL_CTX_up_ref(g_ssl_ctx);
    return g_ssl_ctx;
}

请不要对C和C++两个问题进行标注,除非问题是关于它们的。它们是完全不同的语言。“我需要分别为每个客户端维护SSL_CTX对象。”-为什么?只有在CTX不同的情况下才需要这样做。如果它们相同,则可以简单地共享。默认情况下,SSL_CTX配置应相同。但是,从长远来看,不同客户端之间的单个上下文可能需要不同的参数,如压缩、TLS版本更改等。这就是为什么,不是为每个客户端调用SSL_CTX_new()和问题中列出的所有函数,只有偏离默认值的客户端才能根据其要求修改SSL_CTX。因此。我的问题是复制而不是共享相同的上下文。或者在同一个
SSL\u-new
上执行多个
SSL\u-CTX
(每个连接一个),它可以有效地为您实现这一点。我希望避免多个SSL\u-CTX\u-new()+每个客户端的函数列表,因为它们大多数都将遵循默认上下文设置。但是,我不能与所有连接共享相同的上下文,因为可能会更新某些客户端的设置,如压缩、TLS版本等,将来可能会在不同客户端之间更改。所以我需要为每个连接使用单独的SSL_CTX,同时避免重复调用相同的函数。如果我可以简单地为每个连接复制全局ctx,我就可以修改参数而不修改全局ctx。