在运行的服务器上(使用OpenSSL 1.1.1d),我尝试使用以下回调API从ClientHello消息中提取服务器名称(SNI)扩展名:
SSL_client_hello_get0_ext
同TLSEXT_TYPE_server_name
类型中进行回购。SSL_get_servername
以TLSEXT_NAMETYPE_host_name
作为记录。但是似乎没有任何作用,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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句