关于 TLS Client_Hello 版本的问题分析

关于 TLS Client_Hello 版本的问题分析
一、 报文结构
在这里插入图片描述

如上图,TLS 数据结构由Content Type 、Version、 Length、fragment四部分构成,Version在 Record Layer 和Handshake Protocol中均有出现。
RFC 5246 6.2.1 定义的数据结构
RFC 5246 6.2.1 定义的数据结构

Record Layer中的version定义如下:
RFC 5246 6.2.1 record layer Version的描述
RFC 5246 6.2.1 record layer Version的描述
Record Layer 中的Version为此报文所采用的TLS 协议版本:
在这里插入图片描述

Client Hello中的client_version定义如下:
RFC 5246 7.4.1.2 record layer Version的描述
RFC 5246 7.4.1.2 record layer Version的描述
Client_version为客户端所希望采用的通信协议。

二、 报文解析
原始报文 原始报文
科来改变两处version的值

                         **科来改变两处version的值**

加工报文
加工报文

Client报文的封装和解析与Version协议版本无关,即使上下version均修改后,报文仍然可以得到正确的解析。
与之对应的,DTLS报文的封装与解析,与Version相关,修改为无法识别的Version后将无法正确解析,如下图:
原始报文
原始报文
科来改变record layer version的值
科来改变record layer version的值
加工报文
加工报文

对此,RFC 5246 E.1中解释如下:
RFC 5246 E.1
RFC 5246 E.1
SSL 3.0、TLS 1.0、TLS 1.1、TLS 1.2保持兼容的clienthello数据格式,只要保持兼容的数据格式,即使未来出现更高的tls 协议版本,服务器也能够进行处理。

三、 Version 版本问题
以上可知,因为client_hello的兼容性,无论Record Layer使用哪种TLS协议版本,client_hello数据报文均能够得到有效的解析,最终完成数据通信过程中的TLS协议版本协商。
对于Record Layer常使用TLS 1.0版本的协议,RFC 5246 E.1解释如下:
RFC 5246 E.1
RFC 5246 E.1
一些服务器没有正确的实现version协商,有一些有问题的TLS 1.0服务器,当客户提供比TLS 1.0更高的版本时,它们会简单地关闭连接。
结论:ClientHello报文的解析与tls版本无关,客户端与服务器进行TLS握手时,因需考虑服务器兼容问题,会先以TLS 1.0发送client hello完成version协商。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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消息结构有所改变,需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值