如何在TLS应用程序中复制SSL_CTX对象?
我有一份申请。使用openssl实现TLS v1.2的c 应用程序应打开到使用同一版本TLS运行的远程服务器的多个远程连接。我有一套用于所有连接的密钥、证书和CA_证书 我需要分别为每个客户端维护如何在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
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深度()
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。