我想与 OpenSSL 建立多个连接。

  • 我应该为每个新连接创建新的 SSL_CTX context 还是使用一个 context 接受所有连接?
  • 我是否应该使用内存或启动/停止连接执行其他操作,除了
    close(_socket); //socket which accept the connection
    SSL_shutdown(_ssl); //_ssl — SSL connection
    SSL_free (_ssl);
    
  • 最佳答案



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

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

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

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

    如果您的服务器使用不同的证书监听 foo.combar.com,那么您将需要三个上下文。一种默认上下文用于非 SNI 客户端,一种上下文用于 foo.com ,一种上下文用于 bar.com

    实际上,两个站点之间唯一可能发生变化的是提供的证书。因此,您使用默认上下文进行聆听。如果客户端通过 SNI 提供了服务器名称,那么您可以在 servername 回调和 SSL_set_SSL_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.combar.com 的上下文。它创建一次,然后重用相同的。

    对于默认上下文,您可以使用 SSL_CTX_set_tlsext_servername_callback 设置 servername 回调。无需为非默认上下文设置它。
    SSL_CTX_set_tlsext_servername_callback(ctx, ServerNameCallback);
    

    上下文被引用计数,因此您可以重用它们。



    在这里,您应该寻求对该主题的治疗。例如,您不应在 close 之前调用 SSL_shutdown 。并且第一次调用 SSL_shutdown 可能会失败,所以你需要知道下一步该怎么做。

    有关该主题的处理,请参阅 Eric Rescorla 的教程: An Introduction to OpenSSL Programming, Part I of IIAn Introduction to OpenSSL Programming, Part II of II 。或者得到这本书: Network Security with OpenSSL

    关于与 OpenSSL 的多个连接的上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29195960/

    10-12 17:28
    查看更多