gpt4 book ai didi

ssl - 使用 OpenSSL 正确关闭 SSL 连接

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:30 25 4
gpt4 key购买 nike

我在主线程中有 SSL 连接并且有内存泄漏。

我以这种方式关闭连接(_ssl — SSL* 对象):

SSL_shutdown(_ssl);
SSL_free (_ssl);

但是内存没有正确释放——在每个新客户端之后,一些内存 (~20kb) 没有被释放。我做了一个实验:建立许多连接(~7000)并在建立后关闭它们。图表显示内存一直在增长。对我来说,内存在连接之间是不变的,这一点非常重要。有什么建议么?

图表: enter image description here

更新:我使用的所有功能:

它在服务器启动时执行一次(我认为它不能成为从连接到连接增加内存的原因):

    SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
SSL_METHOD* meth = TLSv1_server_method();

_ctx = SSL_CTX_new (meth);

SSL_CTX_set_verify(_ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_verify_depth(_ctx, 1);

if (!_ctx) {
ERR_print_errors_fp(stderr);
exit(2);
}

if (SSL_CTX_load_verify_locations(_ctx, "keys/c1.crt", NULL) <= 0)
{
ERR_print_errors_fp(stderr);
exit(3);
}


SSL_CTX_set_verify(_ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_verify_depth(_ctx,1);

if (SSL_CTX_use_certificate_file(_ctx, CERTF, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
exit(3);
}
if (SSL_CTX_use_PrivateKey_file(_ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
exit(4);
}

if (!SSL_CTX_check_private_key(_ctx)) {
fprintf(stderr, "Private key does not match the certificate public key\n");
exit(5);
}

它在开始时为每个连接执行:

    ERR_remove_state(0);

_ssl = SSL_new (ctx);
if (_ssl == NULL)
{
_isValid = false;
return;
}
SSL_set_fd (_ssl, _sd->get_num());
int err = SSL_accept (_ssl);
if (err == -1)
{
ERR_print_errors_fp(stderr);
_isValid = false;
return;
}

最佳答案

您必须释放您在此连接中使用的所有资源。 OpenSSL 在这些资源上有一个引用计数器,有些函数返回给你一些增加了计数器的东西,有些则没有,所以你必须真正查看(通常是不够的)文档。 OpenSSL 不会跟踪您在此连接中分配了哪些资源,并在您调用 SSL_free 后自动归还这些资源,您必须自己处理。

关于您在代码中实际执行的操作的信息不足,无法查看是否确实存在泄漏以及泄漏来自何处。但举个例子:如果您调用 SSL_get_peer_certificate 来获取证书,您必须显式释放内存,因为(来自 documentation ):

The reference count of the X509 object is incremented by one, so that it will not be destroyed when the session containing the peer certificate is freed. The X509 object must be explicitly freed using X509_free().

相反,类似的功能SSL_get_peer_chain不会增加引用计数器,因此您不应尝试自己释放资源:

The reference count of the STACK_OF(X509) object is not incremented. If the corresponding session is freed, the pointer must not be used any longer.

所以你必须实际查看你使用的每个函数,并检查你是否需要显式释放分配的资源。

关于ssl - 使用 OpenSSL 正确关闭 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29200797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com