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



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

  • 使用TLSEXT_TYPE_server_name类型调用SSL_client_hello_get0_ext,就像在存储库中一样。
  • 使用记录的TLSEXT_NAMETYPE_host_name呼叫SSL_get_servername

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

我注意到的一件事是,只有在完成 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手动解析服务器名称扩展名(如此处所示(。

最新更新