gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:46 24 4
gpt4 key购买 nike

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

  • 使用 TLSEXT_TYPE_server_name 类型调用 SSL_client_hello_get0_ext,如 repo 中所做的那样.
  • 使用 TLSEXT_NAMETYPE_host_name 调用 SSL_get_servername as documented .

然而似乎没有任何效果,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 必须直接从服务器名称回调中调用,因此不能解决原始问题。

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

关于c++ - 无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59342130/

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