0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单介绍TLS1.2握手和协商过程

RTThread物联网操作系统 来源:lp 2019-04-10 15:22 次阅读

前言

随着物联网的发展,连接到互联网的设备数量呈指数增长,物联网信息安全越来越重要。

因此,TLS 逐渐成为物联网通讯的标配。但是 TLS 是加密传输,这给调试增加了一定的难度。

笔者最近工作中一直用到 HTTPS,但是苦于 wireshark 只能抓取 HTTP 的明文数据包,无法抓取 HTTPS 的数据包,于是就有了这篇文章,在 RT-Thread 系统上,使用 wireshark 抓取 HTTPS 数据包.

简单介绍TLS1.2握手和协商过程

client hello

客户端向服务器发送 tls 版本,加密方式,客户端随机数等。

server hello

服务器端返回协商信息的结果,包括使用的 tls 版本,使用哪一种加密方式(cipher suite), 服务器的随机数(random_s)。

证书校验

客户端验证证书的合法性,如果验证通过才会进行后续通讯

client key exchange

客户端发送协商密钥发送给服务端

server change cipher spec

服务器通知客户端以后使用此协商密钥进行加密

hangshake message finish

客户端接收服务器发送的握手消息,验证通过后,握手完成。

此后的通讯都采用协商密钥和加密算法通讯。

设备端解密https数据包

查阅文档得知,wireshark 支持将 tls 会话中使用的密钥保存到外部文件中,供 wireshark 使用。

流程图

在没有抓包路由器的情况下,使用方案A, 电脑创建 wifi 热点,设备端连接电脑热点,并发起 https 请求,服务器接收到请求,向设备端发出响应,设备端根据响应的内容,计算出密钥, 并将设备端随机数和密钥通过 udp 发送到 pc,保存到 sslkey.log 文件,wireshark 根据设备端随机数和密钥即可将 tls 数据包解密。

配置wireshark

新建 sslkey.log 文件,并配置为 windows 系统变量。

配置 wireshark编辑->首选项->protocols->SSL(version 2.4.9),更高版本的 wireshark 操作步骤为:编辑->首选项->protocols->TLS

配置好之后重启 wireshark

按照下面的格式,向 sslkey.log 写入客户端随机数和密钥, 即可使 wireshark 解密 tls 数据包.

1CLIENT_RANDOM5a497axx3756f69b4axxx2CLIENT_RANDOM5dfb96xxb07a9da164xxx3CLIENT_RANDOM5a497axx12e14567b9xxx4CLIENT_RANDOM55c00xxxb07a9da164xxx5CLIENT_RANDOM5a497xxxb03ca0d5fcxxx

数据的含义如下:

CLIENT_RANDOM: 固定标签(支持 SSL 3.0, TLS 1.0, 1.1, 1.2)

第二个参数:客户端随机数(random_c)32个字节,编码为64个十六进制字符

第三个参数: 48字节的协商密钥,编码为96个十六进制字符

接下来只要找到设备上的客户端随机数和密钥,保存到 syskey.log,即可通过 wireshark 解密 tls 数据包。

下面函数,保存了客户端随机数和密钥信息。

ssl_tls.c

1intmbedtls_ssl_derive_keys(mbedtls_ssl_context*ssl) 2{ 3... 4 5MBEDTLS_SSL_DEBUG_MSG(3,("ciphersuite=%s", 6mbedtls_ssl_get_ciphersuite_name(session->ciphersuite))); 7MBEDTLS_SSL_DEBUG_BUF(3,"mastersecret",,48); 8MBEDTLS_SSL_DEBUG_BUF(4,"randombytes",handshake->randbytes,64); 9MBEDTLS_SSL_DEBUG_BUF(4,"keyblock",keyblk,256);10...11}

其中session->master保存的是密钥,handshake->randbytes保存的是客户端和服务器的随机数。也就是说,将这两个参数保存到 sslkey.log 文件中,那么 wireshark 就能解密设备上的https数据包。

编写 udp 客户端,将客户端随机数和密钥发送到 windows,windows 编写 udp server python 脚本,用于接收数据,并将数据写入 sslkey.log 文件

1#include 2#include 3 4#include 5#include"netdb.h" 6 7staticintport=5000; 8 9voidudpcli_send(char*ip,char*random_c,intrandom_len,char*master,intmaster_len)10{11intsock;12structhostent*host;13structsockaddr_inserver_addr;14charrandom_ptr[100]={0};15charmaster_ptr[100]={0};16inti=0;1718if(random_c==RT_NULL||master==RT_NULL)19{20rt_kprintf("random_cormasterisnull\n");21return;22}2324host=(structhostent*)gethostbyname(ip);25if(host==RT_NULL)26{27rt_kprintf("Gethostbynamefailed!\n");28return;29}3031//randomserver_random:32bit+client_random:32bit32for(i=0;i< 32; i++)33    {34        sprintf(&random_ptr[i*2], "%02x", random_c[32+i]);35    }3637    for(i = 0; i < 48; i++)38    {39        sprintf(&master_ptr[i*2], "%02x", master[i]);40    }    41    rt_kprintf("random : %s\n", random_ptr);42    rt_kprintf("master : %s\n", master_ptr);4344    if((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)45    {46        rt_kprintf("Create socket error");47        return;48    }4950    server_addr.sin_family = AF_INET;51    server_addr.sin_port = htons(port);52    server_addr.sin_addr = *((struct in_addr *)host->h_addr);5354rt_memset(&(server_addr.sin_zero),0,sizeof(server_addr.sin_zero));5556//sendto(sock,send_data,rt_strlen(send_data),0,(structsockaddr*)&server_addr,sizeof(structsockaddr));57sendto(sock,random_ptr,64,0,(structsockaddr*)&server_addr,sizeof(structsockaddr));58sendto(sock,master_ptr,96,0,(structsockaddr*)&server_addr,sizeof(structsockaddr));5960if(sock>=0)61{62closesocket(sock);63sock=-1;64}65}

udpserver.py

1importsocket 2 3BUFSIZ=1024 4ip_port=('0.0.0.0',5000) 5file=r'd:\work\tmp\sslkey.log' 6 7server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 8server.bind(ip_port) 910whileTrue:11random_c,client_addr=server.recvfrom(BUFSIZ)12master,client_addr=server.recvfrom(BUFSIZ)13print("openfile"+""+file)14write_data='CLIENT_RANDOM'+str(random_c,encoding='utf-8')+''+str(master,encoding='utf-8')15print(write_data)1617withopen(file,'a')asf:18f.write(write_data)19print("closefile"+""+file)

需要注意的是,设备使用上述方法解密 https 的数据包,加密算法目前只能是 RSA,所以还需要强制客户端发送的加密方式(cipher suites)只能是 RSA。

修改packages\mbedtls-latest\ports\inc\tls_config.h,注释掉如下宏定义:

1//#defineMBEDTLS_KEY_EXCHANGE_PSK_ENABLED2//#defineMBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED3//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED4//#defineMBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED5//#defineMBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED6//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED7//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED8//#defineMBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED9//#defineMBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED

这样就可以确保客户端和服务器只使用 RSA 的加密方式进行通信, 但是部分服务器不支持 RSA 的方式,握手过程会失败。

将udpcli_send函数添加到mbedtls_ssl_derive_keys函数中,如下所示

1MBEDTLS_SSL_DEBUG_MSG(3,("ciphersuite=%s", 2mbedtls_ssl_get_ciphersuite_name(session->ciphersuite))); 3MBEDTLS_SSL_DEBUG_BUF(3,"mastersecret",session->master,48); 4MBEDTLS_SSL_DEBUG_BUF(4,"randombytes",handshake->randbytes,64); 5MBEDTLS_SSL_DEBUG_BUF(4,"keyblock",keyblk,256); 6 7//replaceyouripaddress 8udpcli_send("192.168.123.206",handshake->randbytes,32,session->master,48); 910mbedtls_zeroize(handshake->randbytes,sizeof(handshake->randbytes));

windows 运行 python 脚本(注意修改sslkey.log的文件路径)

1pythonudpserver.py

设备联网成功后,在 MSH 终端输入

1\|/ 2-RT-ThreadOperatingSystem 3/|\4.0.1buildApr22019 42006-2019Copyrightbyrt-threadteam 5lwIP-2.0.2initialized! 6[I/SAL_SOC]SocketAbstractionLayerinitializesuccess. 7 8........... 9msh/mnt/sdcard>10msh/mnt/sdcard>11msh/mnt/sdcard>12msh/mnt/sdcard>wgethttps://www.rt-thread.com/service/rt-thread.txt1.txt

wireshark抓包

加密的数据包

解密的数据包

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2909

    文章

    44612

    浏览量

    373143
  • 路由器
    +关注

    关注

    22

    文章

    3729

    浏览量

    113750
  • 数据包
    +关注

    关注

    0

    文章

    261

    浏览量

    24390

原文标题:基于RT-Thread 使用 wireshark 抓取 HTTPS 数据包

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问ESP8266的SDK支持TLS1.2版本吗?

    请问ESP8266的SDK支持TLS1.2版本吗?
    发表于 07-11 07:21

    TLS-V1.2 HTTPS请求吞吐量非常差

    测试与FRIERTOS + LWIP建立在43438。与TLS-V1.1相比,TLS-V1.2 HTTPS请求吞吐量非常差。TLSV1.1每分钟发送的HTTPS请求数是TLSV1.2的14倍。另外
    发表于 10-23 15:14

    用2048位的密钥大小与TLS SSL服务器通信?

    hello”消息没有“Server Hello”返回。APache和板之间的密码套件和协协商似乎很糟糕。有没有机会用2048位的密钥大小与TLS/SSL服务器通信?希望大家能帮忙!谢谢您。
    发表于 04-02 10:12

    深度还原TLS握手问题的排查思路和方法

    问题,说实话,我也是懵的,因为这个错误码在过往的调试、开发、测试过程中并没有见过。虽然之前也遇到过一些 TLS握手失败的问题,一般可能就是CA证书没有配好,或者还有一个 mbedtls配置项
    发表于 08-04 11:31

    请问SPC-5 Studio是否支持这些功能?

    1. TCP IP双栈(Ipv4/Ipv6)2 TLS1.2
    发表于 01-09 08:30

    什么是握手信号? 什么是握手协议?

    什么是握手信号? 什么是握手协议? RS -232通行方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定
    发表于 10-14 10:26 5425次阅读

    TCP三次握手过程描述

    本文档主要描述TCP三次握手过程,一个完整的三次握手也就是 请求---应答---再次确认
    发表于 03-02 15:37 8次下载

    TLS1.3的正式运行版本,为互联网安全筑起了新的长城

    目前网上广泛使用的安全协议TLS1.2始于2008年,这些年来它为网民们遮风挡雨立下汗马功劳,但是在满世界黑客的明枪暗箭攻击下也是满目沧桑。为了修补漏洞,执行TLS1.2协议的软件打满了补丁,俗话说:“新三年旧三年,缝缝补补又三年。” 九年多了,
    的头像 发表于 03-30 09:22 4224次阅读
    <b class='flag-5'>TLS</b>1.3的正式运行版本,为互联网安全筑起了新的长城

    科普:简化SSL/TLS握手过程

    伴随所有握手,SSL / TLS握手是一切开始的地方。SSL / TLS握手涉及一系列步骤,通过该步骤,双方(客户端和服务器)彼此进行验证,
    的头像 发表于 06-27 17:36 2758次阅读

    使用TLS 1.3的优势有哪些

      您会注意到的一个显着差异是执行完全握手时往返次数减少。较旧版本的 TLS 协议要求在客户端发送应用程序数据之前进行两次完整的往返。使用 TLS v1.3,只需要一次往返!此外,服务器可以发送应用程序数据以响应客户端的第一个
    的头像 发表于 10-20 17:05 1441次阅读

    HTTPS协议是什么?为什么安全?

    HTTPS简单理解成HTTP over SSL/TLS。客户端和服务端在使用HTTPS传输业务数据前,首先由SSL/TLS协议在两端之间建立安全信道(这个过程称作
    的头像 发表于 01-08 14:36 2096次阅读

    基于TLS DoIP测试开发实践

    作者|宁国路小龙虾小编|吃不饱车载以太网系列文章“当DoIP遇上TLS介绍了新版ISO13400-2规范变化点、TLS简介以及CANoeTLSdemo工程的数据流,其中TLSDoIP数据流分为4
    的头像 发表于 05-31 09:47 677次阅读
    基于<b class='flag-5'>TLS</b> DoIP测试开发实践

    微软宣布Azure账户取消TLS1.0和1.1支持

    此举涉及到所有现有的及新创建的Azure账户。为确保业务不受影响,IT之家强烈推荐各用户尽早在2024年10月31日前完成TLS1.2的升级,并删除对TLS1.0和1.1的依赖性。实践表明,TLS1.0和1.1无法充分保护数据安
    的头像 发表于 01-11 11:47 569次阅读

    谷歌Chrome浏览器抗量子加密算法被指破坏TLS握手,导致部分网站无法被访问

    谷歌自去年8月起便开始测试后量子安全TLS密钥封装机制,通过采用TLS 1.3及QUIC连接的Kyber768抗量子密钥协商算法,以提升ChromeTLS流量的安全性。
    的头像 发表于 04-30 14:22 572次阅读

    socket 加密通信的实现方式

    握手过程协商加密算法、生成会话密钥。 数据传输: 使用协商的加密算法和会话密钥对数据进行加密和解密。 结束握手: 通信结
    的头像 发表于 11-12 14:18 381次阅读