无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI)

Cannot retrieve Server Name (SNI) from ClientHello using OpenSSL 1.1.1

在我的 运行 服务器上(使用 OpenSSL 1.1.1d)我尝试使用以下回调从 ClientHello 消息中提取服务器名称 (SNI) 扩展 API 来自:

然而似乎没有任何效果,SNI 要么是 NULL 要么是垃圾。

我注意到的一件事是,只有在完成 ClientHello 回调之后我才能提取它,但那时已经太晚了。 有人遇到过类似问题吗?

在下面附上一个演示我如何检索 SNI 的最小代码示例:

int
my_server::client_hello_cb(SSL *ssl, int *al, void *arg)
{
    my_server* server = static_cast<my_server*>(SSL_get_app_data(ssl));
    const char *sni = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);

    server->set_client_sni(sni);
    return 0;
}

void
my_server::create()
{
    SSL* ssl = SSL_new(ctx_);
    SSL_set_app_data(ssl, this);

    BIO* rbio = BIO_new(BIO_s_mem());
    BIO* wbio = BIO_new(BIO_s_mem());
    SSL_set_bio(ssl, rbio, wbio);

    SSL_CTX* ctx = SSL_CTX_new(TLS_server_method());

    SSL_CTX_set_ecdh_auto(ctx, 1);
    SSL_CTX_set_client_hello_cb(ctx, client_hello_cb, nullptr);
}

特别感谢 Steffen 清理内容。

必须直接从服务器名称回调中调用 SSL_get_servername,因此无法解决原始问题。

相反,可以直接从客户端 hello 回调中使用 SSL_client_hello_get0_ext 手动解析服务器名称扩展(如 here 所做的那样)。