0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡單介紹TLS1.2握手和協(xié)商過程

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:lp ? 2019-04-10 15:22 ? 次閱讀

前言

隨著物聯(lián)網(wǎng)的發(fā)展,連接到互聯(lián)網(wǎng)的設(shè)備數(shù)量呈指數(shù)增長,物聯(lián)網(wǎng)信息安全越來越重要。

因此,TLS 逐漸成為物聯(lián)網(wǎng)通訊的標(biāo)配。但是 TLS 是加密傳輸,這給調(diào)試增加了一定的難度。

筆者最近工作中一直用到 HTTPS,但是苦于 wireshark 只能抓取 HTTP 的明文數(shù)據(jù)包,無法抓取 HTTPS 的數(shù)據(jù)包,于是就有了這篇文章,在 RT-Thread 系統(tǒng)上,使用 wireshark 抓取 HTTPS 數(shù)據(jù)包.

簡單介紹TLS1.2握手和協(xié)商過程

client hello

客戶端向服務(wù)器發(fā)送 tls 版本,加密方式,客戶端隨機(jī)數(shù)等。

server hello

服務(wù)器端返回協(xié)商信息的結(jié)果,包括使用的 tls 版本,使用哪一種加密方式(cipher suite), 服務(wù)器的隨機(jī)數(shù)(random_s)。

證書校驗

客戶端驗證證書的合法性,如果驗證通過才會進(jìn)行后續(xù)通訊

client key exchange

客戶端發(fā)送協(xié)商密鑰發(fā)送給服務(wù)端

server change cipher spec

服務(wù)器通知客戶端以后使用此協(xié)商密鑰進(jìn)行加密

hangshake message finish

客戶端接收服務(wù)器發(fā)送的握手消息,驗證通過后,握手完成。

此后的通訊都采用協(xié)商密鑰和加密算法通訊。

設(shè)備端解密https數(shù)據(jù)包

查閱文檔得知,wireshark 支持將 tls 會話中使用的密鑰保存到外部文件中,供 wireshark 使用。

流程圖

在沒有抓包路由器的情況下,使用方案A, 電腦創(chuàng)建 wifi 熱點(diǎn),設(shè)備端連接電腦熱點(diǎn),并發(fā)起 https 請求,服務(wù)器接收到請求,向設(shè)備端發(fā)出響應(yīng),設(shè)備端根據(jù)響應(yīng)的內(nèi)容,計算出密鑰, 并將設(shè)備端隨機(jī)數(shù)和密鑰通過 udp 發(fā)送到 pc,保存到 sslkey.log 文件,wireshark 根據(jù)設(shè)備端隨機(jī)數(shù)和密鑰即可將 tls 數(shù)據(jù)包解密。

配置wireshark

新建 sslkey.log 文件,并配置為 windows 系統(tǒng)變量。

配置 wireshark編輯->首選項->protocols->SSL(version 2.4.9),更高版本的 wireshark 操作步驟為:編輯->首選項->protocols->TLS

配置好之后重啟 wireshark

按照下面的格式,向 sslkey.log 寫入客戶端隨機(jī)數(shù)和密鑰, 即可使 wireshark 解密 tls 數(shù)據(jù)包.

1CLIENT_RANDOM5a497axx3756f69b4axxx2CLIENT_RANDOM5dfb96xxb07a9da164xxx3CLIENT_RANDOM5a497axx12e14567b9xxx4CLIENT_RANDOM55c00xxxb07a9da164xxx5CLIENT_RANDOM5a497xxxb03ca0d5fcxxx

數(shù)據(jù)的含義如下:

CLIENT_RANDOM: 固定標(biāo)簽(支持 SSL 3.0, TLS 1.0, 1.1, 1.2)

第二個參數(shù):客戶端隨機(jī)數(shù)(random_c)32個字節(jié),編碼為64個十六進(jìn)制字符

第三個參數(shù): 48字節(jié)的協(xié)商密鑰,編碼為96個十六進(jìn)制字符

接下來只要找到設(shè)備上的客戶端隨機(jī)數(shù)和密鑰,保存到 syskey.log,即可通過 wireshark 解密 tls 數(shù)據(jù)包。

下面函數(shù),保存了客戶端隨機(jī)數(shù)和密鑰信息。

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保存的是客戶端和服務(wù)器的隨機(jī)數(shù)。也就是說,將這兩個參數(shù)保存到 sslkey.log 文件中,那么 wireshark 就能解密設(shè)備上的https數(shù)據(jù)包。

編寫 udp 客戶端,將客戶端隨機(jī)數(shù)和密鑰發(fā)送到 windows,windows 編寫 udp server python 腳本,用于接收數(shù)據(jù),并將數(shù)據(jù)寫入 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;ih_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)

需要注意的是,設(shè)備使用上述方法解密 https 的數(shù)據(jù)包,加密算法目前只能是 RSA,所以還需要強(qiáng)制客戶端發(fā)送的加密方式(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

這樣就可以確??蛻舳撕头?wù)器只使用 RSA 的加密方式進(jìn)行通信, 但是部分服務(wù)器不支持 RSA 的方式,握手過程會失敗。

將udpcli_send函數(shù)添加到mbedtls_ssl_derive_keys函數(shù)中,如下所示

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 運(yùn)行 python 腳本(注意修改sslkey.log的文件路徑)

1pythonudpserver.py

設(shè)備聯(lián)網(wǎng)成功后,在 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抓包

加密的數(shù)據(jù)包

解密的數(shù)據(jù)包

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2909

    文章

    44671

    瀏覽量

    373691
  • 路由器
    +關(guān)注

    關(guān)注

    22

    文章

    3732

    瀏覽量

    113847
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    261

    瀏覽量

    24398

原文標(biāo)題:基于RT-Thread 使用 wireshark 抓取 HTTPS 數(shù)據(jù)包

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問ESP8266的SDK支持TLS1.2版本嗎?

    請問ESP8266的SDK支持TLS1.2版本嗎?
    發(fā)表于 07-11 07:21

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

    測試與FRIERTOS + LWIP建立在43438。與TLS-V1.1相比,TLS-V1.2 HTTPS請求吞吐量非常差。TLSV1.1每分鐘發(fā)送的HTTPS請求數(shù)是TLSV1.2的14倍。另外
    發(fā)表于 10-23 15:14

    用2048位的密鑰大小與TLS SSL服務(wù)器通信?

    hello”消息沒有“Server Hello”返回。APache和板之間的密碼套件和協(xié)協(xié)商似乎很糟糕。有沒有機(jī)會用2048位的密鑰大小與TLS/SSL服務(wù)器通信?希望大家能幫忙!謝謝您。
    發(fā)表于 04-02 10:12

    深度還原TLS握手問題的排查思路和方法

    問題,說實(shí)話,我也是懵的,因為這個錯誤碼在過往的調(diào)試、開發(fā)、測試過程中并沒有見過。雖然之前也遇到過一些 TLS握手失敗的問題,一般可能就是CA證書沒有配好,或者還有一個 mbedtls配置項
    發(fā)表于 08-04 11:31

    請問SPC-5 Studio是否支持這些功能?

    1. TCP IP雙棧(Ipv4/Ipv6)2 TLS1.2
    發(fā)表于 01-09 08:30

    什么是握手信號? 什么是握手協(xié)議?

    什么是握手信號? 什么是握手協(xié)議? RS -232通行方式允許簡單連接三線:Tx、Rx和地線。但是對于數(shù)據(jù)傳輸,雙方必須對數(shù)據(jù)定
    發(fā)表于 10-14 10:26 ?5440次閱讀

    TCP三次握手過程描述

    本文檔主要描述TCP三次握手過程,一個完整的三次握手也就是 請求---應(yīng)答---再次確認(rèn)
    發(fā)表于 03-02 15:37 ?8次下載

    TLS1.3的正式運(yùn)行版本,為互聯(lián)網(wǎng)安全筑起了新的長城

    目前網(wǎng)上廣泛使用的安全協(xié)議TLS1.2始于2008年,這些年來它為網(wǎng)民們遮風(fēng)擋雨立下汗馬功勞,但是在滿世界黑客的明槍暗箭攻擊下也是滿目滄桑。為了修補(bǔ)漏洞,執(zhí)行TLS1.2協(xié)議的軟件打滿了補(bǔ)丁,俗話說:“新三年舊三年,縫縫補(bǔ)補(bǔ)又三年?!?九年多了,
    的頭像 發(fā)表于 03-30 09:22 ?4231次閱讀
    <b class='flag-5'>TLS</b>1.3的正式運(yùn)行版本,為互聯(lián)網(wǎng)安全筑起了新的長城

    科普:簡化SSL/TLS握手過程

    伴隨所有握手,SSL / TLS握手是一切開始的地方。SSL / TLS握手涉及一系列步驟,通過該步驟,雙方(客戶端和服務(wù)器)彼此進(jìn)行驗證,
    的頭像 發(fā)表于 06-27 17:36 ?2767次閱讀

    使用TLS 1.3的優(yōu)勢有哪些

      您會注意到的一個顯著差異是執(zhí)行完全握手時往返次數(shù)減少。較舊版本的 TLS 協(xié)議要求在客戶端發(fā)送應(yīng)用程序數(shù)據(jù)之前進(jìn)行兩次完整的往返。使用 TLS v1.3,只需要一次往返!此外,服務(wù)器可以發(fā)送應(yīng)用程序數(shù)據(jù)以響應(yīng)客戶端的第一個
    的頭像 發(fā)表于 10-20 17:05 ?1449次閱讀

    HTTPS協(xié)議是什么?為什么安全?

    HTTPS簡單理解成HTTP over SSL/TLS??蛻舳撕头?wù)端在使用HTTPS傳輸業(yè)務(wù)數(shù)據(jù)前,首先由SSL/TLS協(xié)議在兩端之間建立安全信道(這個過程稱作
    的頭像 發(fā)表于 01-08 14:36 ?2112次閱讀

    基于TLS DoIP測試開發(fā)實(shí)踐

    作者|寧國路小龍蝦小編|吃不飽車載以太網(wǎng)系列文章“當(dāng)DoIP遇上TLS介紹了新版ISO13400-2規(guī)范變化點(diǎn)、TLS簡介以及CANoeTLSdemo工程的數(shù)據(jù)流,其中TLSDoIP數(shù)據(jù)流分為4
    的頭像 發(fā)表于 05-31 09:47 ?688次閱讀
    基于<b class='flag-5'>TLS</b> DoIP測試開發(fā)實(shí)踐

    微軟宣布Azure賬戶取消TLS1.0和1.1支持

    此舉涉及到所有現(xiàn)有的及新創(chuàng)建的Azure賬戶。為確保業(yè)務(wù)不受影響,IT之家強(qiáng)烈推薦各用戶盡早在2024年10月31日前完成TLS1.2的升級,并刪除對TLS1.0和1.1的依賴性。實(shí)踐表明,TLS1.0和1.1無法充分保護(hù)數(shù)據(jù)安
    的頭像 發(fā)表于 01-11 11:47 ?576次閱讀

    谷歌Chrome瀏覽器抗量子加密算法被指破壞TLS握手,導(dǎo)致部分網(wǎng)站無法被訪問

    谷歌自去年8月起便開始測試后量子安全TLS密鑰封裝機(jī)制,通過采用TLS 1.3及QUIC連接的Kyber768抗量子密鑰協(xié)商算法,以提升ChromeTLS流量的安全性。
    的頭像 發(fā)表于 04-30 14:22 ?584次閱讀

    socket 加密通信的實(shí)現(xiàn)方式

    握手過程協(xié)商加密算法、生成會話密鑰。 數(shù)據(jù)傳輸: 使用協(xié)商的加密算法和會話密鑰對數(shù)據(jù)進(jìn)行加密和解密。 結(jié)束握手: 通信結(jié)
    的頭像 發(fā)表于 11-12 14:18 ?420次閱讀