c语言 提取 clienthello 里的 server_name
时间: 2023-07-15 20:13:56 浏览: 106
取一个服务器的域名
在TLS协议中,ClientHello消息包含了客户端支持的加密算法、随机数、会话ID以及请求的服务端主机名(server_name)等信息。如果你想在C语言中提取ClientHello里的server_name,可以按照以下步骤进行:
1. 解析TLS握手协议,获取ClientHello消息。
2. 在ClientHello消息中查找“扩展”字段。
3. 在扩展字段中查找“server_name”字段。
4. 解析server_name字段,获取主机名。
以下是一个简单的示例代码,仅供参考:
```c
#include <stdio.h>
#include <string.h>
#include "tls.h"
int main() {
// 假设client_hello消息已经获取到了
char client_hello[] = "...";
int client_hello_len = strlen(client_hello);
// 解析TLS握手协议
struct tls_handshake *handshake = (struct tls_handshake *)client_hello;
int handshake_len = client_hello_len - sizeof(struct tls_record);
// 获取ClientHello消息
struct tls_client_hello *client_hello_msg = (struct tls_client_hello *)handshake->msg_body;
int client_hello_msg_len = handshake_len - sizeof(struct tls_handshake);
// 查找扩展字段
struct tls_extension *ext = (struct tls_extension *)client_hello_msg->extensions;
int ext_len = client_hello_msg_len - sizeof(struct tls_client_hello);
while (ext_len > 0) {
// 找到server_name字段
if (ext->type == TLS_EXT_SERVER_NAME) {
// 解析server_name字段,获取主机名
struct tls_server_name *server_name = (struct tls_server_name *)ext->data;
int server_name_len = ntohs(server_name->name_length);
char *host_name = (char *)server_name->name;
printf("server_name: %.*s\n", server_name_len, host_name);
}
ext_len -= sizeof(struct tls_extension) + ntohs(ext->data_length);
ext = (struct tls_extension *)((char *)ext + sizeof(struct tls_extension) + ntohs(ext->data_length));
}
return 0;
}
```
需要注意的是,以上代码仅适用于TLS 1.2版本及以下的协议。在TLS 1.3中,ClientHello消息结构有所改变,需要进行相应的调整。
阅读全文