无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI)
Cannot retrieve Server Name (SNI) from ClientHello using OpenSSL 1.1.1
在我正在运行的服务器上(使用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
手动解析服务器名称扩展名(如此处所示(。
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 如何在 Minecraft 服务器上执行命令
- 调试编译的服务器在数据库打开时崩溃
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 每个服务器请求的内存预算
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 使用嵌入式猫鼬服务器托管应用程序
- 无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI)