【问题标题】:OpenSSL will not release file handlesOpenSSL 不会释放文件句柄
【发布时间】:2017-08-15 15:27:42
【问题描述】:

我正在编写一个服务(CentOS 的 C 语言),它必须通过 SSL 与第三方 REST API 建立大量出站 SSL 连接。

OpenSSL 用于创建与远程服务器的安全连接。初始化 ssl_connection 后,我将返回的文件描述符注册到我们的 epoll 队列中。

我可以连接并执行 API 事务了。之后,远程服务器终止连接,我们在 fd 上获得 EPOLLRDHUP 并调用我们的清理例程。

    signal(SIGPIPE,SIG_IGN);

    if(PS(endpoint)->ssl != NULL)
    {
        if(SSL_shutdown(PS(endpoint)->ssl)==0)
        {
            SSL_shutdown(PS(endpoint)->ssl);
        }
    }

   if(PS(endpoint)->web != NULL)
   {
        BIO_free(PS(endpoint)->web);    // This can cause a SIGPIPE, especialy when debugging!
        PS(endpoint)->web = NULL;
   }

通过此关闭过程,一切似乎都正常,没有抛出任何错误。

但是 - 每个后续连接都需要下一个系统 fd,最终所有文件描述符都被耗尽,达到 1028 的操作系统软限制。

所以问题是 fd 没有被关闭并释放回内核?

这是通过

确认的
ls /proc/$PID/fd/ | wc -l

谁能帮忙解决正确的 OpenSSL 会话关闭过程?

【问题讨论】:

    标签: c linux ssl service openssl


    【解决方案1】:

    SSL_shutdown 文档提到,它只是发送关闭通知以在两端正确关闭 TLS 连接

    它实际上并没有关闭套接字,您的应用程序应该在 fd 上显式调用close() 以便正确关闭套接字。 由于您当前的套接字没有正确关闭,FD 没有被重用并且每个新套接字都获得新的 FD,最终如您所提到的那样超出限制

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2011-12-04
      相关资源
      最近更新 更多