C 使用OpenSSL进行多个连接的上下文

C 使用OpenSSL进行多个连接的上下文,c,ssl,openssl,connection,C,Ssl,Openssl,Connection,我想使用OpenSSL获得多个连接 我应该为每个新连接创建新的SSL\u CTX上下文,还是使用一个上下文接受所有连接 我应该使用内存或启动/停止连接执行其他操作吗 close(_socket); //socket which accept the connection SSL_shutdown(_ssl); //_ssl — SSL connection SSL_free (_ssl); 我应该为每个新连接创建新的SSL_CTX上下文,还是接受具有一个上下文的所有连接 它取决于服务器名称和

我想使用OpenSSL获得多个连接

  • 我应该为每个新连接创建新的
    SSL\u CTX上下文
    ,还是使用一个
    上下文接受所有连接

  • 我应该使用内存或启动/停止连接执行其他操作吗

    close(_socket); //socket which accept the connection
    SSL_shutdown(_ssl); //_ssl — SSL connection
    SSL_free (_ssl);
    
  • 我应该为每个新连接创建新的SSL_CTX上下文,还是接受具有一个上下文的所有连接

    它取决于服务器名称和不同证书的数量

    如果您有一个服务器名和一个证书,则使用一个默认上下文

    如果您有多个服务器名称和一个证书,则使用一个默认上下文

    如果您有多个服务器名和多个证书,请参阅下面的SNI或servername回调和上下文中的交换


    如果服务器侦听具有不同证书的
    foo.com
    bar.com
    ,则需要三个上下文。一个默认上下文用于非SNI客户端,一个上下文用于
    foo.com
    ,一个上下文用于
    bar.com

    实际上,两个站点之间唯一可能发生变化的是所提供的证书。因此,您可以使用默认上下文进行收听。如果客户机通过SNI提供了服务器名,那么您可以在服务器名回调和
    SSL\u set\u SSL\u CTX
    中的另外两个上下文之一进行交换。下面是它的外观:

    static int ServerNameCallback(SSL *ssl, int *ad, void *arg)
    {
        UNUSED(ad);
        UNUSED(arg);
    
        ASSERT(ssl);
        if (ssl == NULL)
            return SSL_TLSEXT_ERR_NOACK;
    
        const char* servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
        ASSERT(servername && servername[0]);
        if (!servername || servername[0] == '\0')
            return SSL_TLSEXT_ERR_NOACK;   
    
        /* Need a certificate and context for this domain */
        SSL_CTX* ctx = GetServerContext(servername);
        ASSERT(ctx != NULL);
        if (ctx == NULL)
            return SSL_TLSEXT_ERR_NOACK;
    
        /* We should not be peeking into the object like this... */
        ASSERT(ctx != ssl->ctx);
    
        /* Useless return value */
        SSL_CTX* v = SSL_set_SSL_CTX(ssl, ctx);
    
        return SSL_TLSEXT_ERR_OK;
    }
    
    GetServerContext
    仅为
    foo.com
    bar.com
    提供上下文。它创建它们一次,然后重用相同的

    对于默认上下文,使用
    SSL\u CTX\u set\u tlsext\u servername\u回调设置servername回调
    。无需将其设置为非默认上下文

    SSL_CTX_set_tlsext_servername_callback(ctx, ServerNameCallback);
    
    上下文被引用,因此您可以重用它们


    我应该用记忆做额外的动作还是用记忆做其他事情 启动/停止连接,除非

    close(_socket); //socket which accept the connection
    SSL_shutdown(_ssl); //_ssl — SSL connection
    SSL_free (_ssl);
    
    在这里,你应该寻求对这个问题的处理。例如,在
    SSL\u shutdown
    之前不应调用
    close
    。第一次调用SSL\u shutdown可能会失败,因此您需要知道下一步要做什么


    有关该主题的处理方法,请参阅Eric Rescorla的教程:和。或者获取以下书籍:。

    相关,请参阅。我收到此错误:“GetServerContext”未在此文档中声明scope@udit043-你必须自己写。它为域选择一个证书。谢谢,我刚刚开始处理这个字段,这就是我不知道的原因:)