淺談HTTPS以及Fiddler抓取HTTPS協議

原文?淺談HTTPS以及Fiddler抓取HTTPS協議

最近想嘗試基于Fiddler的錄制功能做一些接口的獲取和處理工作,碰到的一個問題就是簡單連接Fiddler只能抓取HTTP協議,關鍵的登錄請求等HTTPS協議都沒有捕捉到,所以想讓Fiddler能夠同時抓取到HTTPS和HTTP協議,設置只是很小的一步,關鍵是了解HTTPS協議的原理、Fiddler抓取HTTPS協議的原理,然后才能更好的理解如何進行設置。本文主要由三部分組成,第一部分用比較通俗形象的方式簡述了HTTPS的原理,第二部分則是在第一部分的基礎上介紹Fiddler抓取HTTPS協議的原理,最后第三部分就是如何對Fiddler及手機進行設置讓其捕捉HTTPS協議。

一、淺談HTTPS

我們都知道HTTP并非是安全傳輸,在HTTPS基礎上使用SSL協議進行加密構成的HTTPS協議是相對安全的。目前越來越多的企業選擇使用HTTPS協議與用戶進行通信,如百度、谷歌等。HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。網上有諸多資料,有些寫得過于晦澀難懂,尤其是需要密碼學的一些知識。我做了一下簡單的整理,刨除復雜的底層實現,單從理解SSL協議的角度宏觀上認識一下HTTPS。一言以弊之,HTTPS是通過一次非對稱加密算法(如RSA算法)進行了協商密鑰的生成與交換,然后在后續通信過程中就使用協商密鑰進行對稱加密通信。HTTPS協議傳輸的原理和過程簡圖如下所示:

HTTPS協議傳輸原理

一共有8個步驟,我們針對每一步,具體看看發生了什么事:

?

  1. 第一步,客戶端發起明文請求:將自己支持的一套加密規則、以及一個隨機數(Random_C)發送給服務器。
  1. 第二步,服務器初步響應:服務器根據自己支持的加密規則,從客戶端發來的請求中選出一組加密算法與HASH算法,生成隨機數,并將自己的身份信息以證書(CA)的形式發回給瀏覽器。CA證書里面包含了服務器地址,加密公鑰,以及證書的頒發機構等信息。這時服務器給客戶端的包括選擇使用的加密規則、CA證書、一個隨機數(Random_S)。
  2. 第三步,客戶端接到服務器的初步響應后做四件事情:
    (1)證書校驗: 驗證證書的合法性(頒發證書的機構是否合法,證書中包含的網站地址是否與正在訪問的地址一致等)。
    (2)生成密碼:瀏覽器會生成一串隨機數的密碼(Pre_master),并用CA證書里的公鑰加密(enc_pre_master),用于傳給服務器。
    (3)計算協商密鑰:
    此時客戶端已經獲取全部的計算協商密鑰需要的信息:兩個明文隨機數 Random_C 和 Random_S 與自己計算產生的 Pre-master,計算得到協商密鑰enc_key。
    enc_key=Fuc(random_C, random_S, Pre-Master)
    (4)生成握手信息:使用約定好的HASH計算握手消息,并使用協商密鑰enc_key及約定好的算法對消息進行加密。
  3. 第四步,客戶端將第三步產生的數據發給服務器:
    這里要發送的數據有三條:
    (1)用公鑰加密過的服務器隨機數密碼enc_pre_master
    (2)客戶端發給服務器的通知,"以后我們都要用約定好的算法和協商密鑰進行通信的哦"。
    (3)客戶端加密生成的握手信息。
  4. 第五步,服務器接收客戶端發來的數據要做以下四件事情:(1)私鑰解密:使用自己的私鑰從接收到的enc_pre_master中解密取出密碼Pre_master。
    (2)計算協商密鑰:此時服務器已經獲取全部的計算協商密鑰需要的信息:兩個明文隨機數 Random_C 和 Random_S 與Pre-master,計算得到協商密鑰enc_key。
    enc_key=Fuc(random_C, random_S, Pre-Master)
    (3)解密握手消息:使用協商密鑰enc_key解密客戶端發來的握手消息,并驗證HASH是否與客戶端發來的一致。
    (4)生成握手消息使用協商密鑰enc_key及約定好的算法加密一段握手消息,發送給客戶端。
  5. 第六步,服務器將第五步產生的數據發給客戶端:
    這里要發的數據有兩條:
    (1)服務器發給客戶端的通知,”聽你的,以后我們就用約定好的算法和協商密鑰進行通信哦“。
    (2)服務器加密生成的握手信息。
  6. 第七步,客戶端拿到握手信息解密,握手結束。
    客戶端解密并計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束。
  7. 第八步,正常加密通信
    握手成功之后,所有的通信數據將由之前協商密鑰enc_key及約定好的算法進行加密解密。

這里客戶端與服務器互相發送加密的握手消息并驗證,目的是為了保證雙方都獲得了一致的密碼,并且可以正常的加密解密數據,為后續真正數據的傳輸做一次測試。另外,HTTPS一般使用的加密與HASH算法如下:非對稱加密算法:RSA,DSA/DSS對稱加密算法:AES,RC4,3DESHASH算法:MD5,SHA1,SHA256其中非對稱加密算法用于在握手過程中加密生成的密碼,對稱加密算法用于對真正傳輸的數據進行加密,而HASH算法用于驗證數據的完整性。由于瀏覽器生成的密碼是整個數據加密的關鍵,因此在傳輸的時候使用了非對稱加密算法對其加密。非對稱加密算法會生成公鑰和私鑰,公鑰只能用于加密數據,因此可以隨意傳輸,而服務器的私鑰用于對數據進行解密,所以服務器都會非常小心的保管自己的私鑰,防止泄漏。

二、Fiddler抓取HTTPS協議原理

我們都知道,Fiddler是個很好的代理工具,可抓取協議請求用于調試。關于Fiddler抓取HTTP協議的原理和配置比較簡單,對Fiddler和客戶端稍作配置,便能使得Fiddler輕易地獲取HTTP請求。但是由于HTTPS協議的特殊性,要進一步地配置Fiddler,我們首先要了解一下fiddler抓取HTTPS協議的原理才能更好地理解如何對fiddler進行配置。Fiddler本身就是一個協議代理工具,在上一節HTTPS原理圖上,客戶端與服務器端進行通信的過程全部都由Fiddler獲取到,也就是如下圖所示:


Fiddler抓取HTTPS協議原理圖

我們看到Fiddler抓取HTTPS協議主要由以下幾步進行:

  1. 第一步,Fiddler截獲客戶端發送給服務器的HTTPS請求,Fiddler偽裝成客戶端向服務器發送請求進行握手 。
  1. 第二步,服務器發回相應,Fiddler獲取到服務器的CA證書, 用根證書公鑰進行解密, 驗證服務器數據簽名, 獲取到服務器CA證書公鑰。然后Fiddler偽造自己的CA證書, 冒充服務器證書傳遞給客戶端瀏覽器。
  2. 第三步,與普通過程中客戶端的操作相同,客戶端根據返回的數據進行證書校驗、生成密碼Pre_master、用Fiddler偽造的證書公鑰加密,并生成HTTPS通信用的對稱密鑰enc_key。
  3. 第四步,客戶端將重要信息傳遞給服務器, 又被Fiddler截獲。Fiddler將截獲的密文用自己偽造證書的私鑰解開, 獲得并計算得到HTTPS通信用的對稱密鑰enc_key。Fiddler將對稱密鑰用服務器證書公鑰加密傳遞給服務器。
  4. 第五步,與普通過程中服務器端的操作相同,服務器用私鑰解開后建立信任,然后再發送加密的握手消息給客戶端。
  5. 第六步,Fiddler截獲服務器發送的密文, 用對稱密鑰解開, 再用自己偽造證書的私鑰加密傳給客戶端。
  6. 第七步,客戶端拿到加密信息后,用公鑰解開,驗證HASH。握手過程正式完成,客戶端與服務器端就這樣建立了”信任“。

在之后的正常加密通信過程中,Fiddler如何在服務器與客戶端之間充當第三者呢?

服務器—>客戶端:Fiddler接收到服務器發送的密文, 用對稱密鑰解開, 獲得服務器發送的明文。再次加密, 發送給客戶端。
客戶端—>服務端:客戶端用對稱密鑰加密,被Fiddler截獲后,解密獲得明文。再次加密,發送給服務器端。由于Fiddler一直擁有通信用對稱密鑰enc_key, 所以在整個HTTPS通信過程中信息對其透明。

從上面可以看到,Fiddler抓取HTTPS協議成功的關鍵是根證書(具體是什么,可Google),這是一個信任鏈的起點,這也是Fiddler偽造的CA證書能夠獲得客戶端和服務器端信任的關鍵。
接下來我們就來看如果設置讓Fiddler抓取HTTPS協議。

三、Fiddler抓取HTTPS設置

注意以下操作的前提是,手機已經能夠連上Fiddler,這部分的配置過程簡單就不贅述了,可參考:手機如何連接Fiddler 。
如何繼續配置讓Fiddler抓取到HTTPS協議呢?
(一)首先對Fiddler進行設置:打開工具欄->Tools->Fiddler Options->HTTPS

對Fiddler進行設置

選中Capture HTTPS CONNECTs,因為我們要用Fiddler獲取手機客戶端發出的HTTPS請求,所以中間的下拉菜單中選中from remote clients only。選中下方Ignore server certificate errors.
(二)然后,就是手機安裝Fiddler證書。
這一步,也就是我們上面分析的抓取HTTPS請求的關鍵。
操作步驟很簡單,打開手機瀏覽器,在瀏覽器地址輸入代理服務器IP和端口,會看到一個Fiddler提供的頁面。
![](//upload-images.jianshu.io/upload_images/1430132-60573b1ef023e99d.png?imageMogr2/auto-orient/strip%7
CimageView2/2/w/1240)
接著點擊最下方的FiddlerRoot certificate,這時候點擊確定安裝就可以下載Fiddler的證書了。
下載安裝完成好后,我們用手機客戶端或者瀏覽器發出HTTPS請求,Fiddler就可以截獲到了,就跟截獲普通的HTTP請求一樣。

?

好啦,以上就是關于HTTPS的簡介以及Fiddler如何獲取HTTPS協議的原理和配置,看到Fiddler整齊劃一地截獲到HTTP和復雜的HTTPS協議,心里還有點小激動呢。



作者:隋胖胖LoveFat
鏈接:https://www.jianshu.com/p/54dd21c50f21
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453023.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于.c和.h 和定義變量的問題

最初調試的時候是因為有個錯誤在wavplay.h文件中 于是我跳到了recorderl.h中:從圖中看到引用了main.h 出現這個問題的具體原因還是不太清楚: 不過我任務是因為: wavplay.h中定義了 __WaveHeader 變量 在main.h文件中引用了wavplay.h 而在wavplay.h中試圖引用main.h里的 __Wa…

halcon中面到面的距離_halcon學習筆記——(8)由標定板得到測量平面位姿-阿里云開發者社區...

如圖:由標定板位姿獲取測量板位姿1.pose_to_hom_mat3d( : : Pose : HomMat3D)把三維位姿轉化為齊次變換矩陣2.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate)相對于新坐標系的平移變換/ 1 0 0 \ / Tx \HomMat3DTranslate HomMat3D *…

進程同步與互斥的區別

并發進程的執行會產生相互制約的關系:一種是進程之間競爭使用臨界資源,只能讓他們逐個使用,這種現象稱為互斥,是一種競爭關系。另一種是進程之間協同完成任務,在關鍵點上等待另一進程發來的消息,以便協同一…

《軟件調試分析技術》學習筆記

《軟件調試分析技術》學習筆記(一) 今天開始寫寫一些心得體驗。 《軟件調試分析技術》是好友Monster的處女作品。作為一直以的好伙伴,他是我看著長大的,(*^__^*) 嘻嘻……之所以有今天這樣的成績,是與他的努力和天賦…

new Date()時間

var myDate new Date(); myDate.toLocaleDateString();可以獲取當前日期myDate.toLocaleTimeString(); 可以獲取當前時間擴展:myDate.getYear(); //獲取當前年份(2位)myDate.getFullYear(); //獲取完整的年份(4位,1970-????)myDate.getMonth(); //獲…

什么是對等網絡

對等網也稱工作組。在對等網絡中,計算機的數量通常不會超過10臺。所以對等網絡相對比較簡單。在對等網絡中,對等網上各臺計算機的有相同的功能,無主從之分,網上任一節臺計算機既可以作為網絡服務器,其資源為其它計算機…

python初中必背語法_一些python語法的合集

貼幾道自己做過的py題防止忘了,好像包含的語法還挺多的洛谷1018nn,mminput().split( )oint(input())nint(nn);mint(mm)a[[]];c[[]]for i in range (1,43):a.append([]);c.append([])for i in range (1,43):for j in range (1,43):a[i].append(0),c[i].append(0)b[]f…

微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"} 聲明:是已認證的服務號 這個問題已解決!! 前置說明 網頁授權獲取用戶基本信息:兩種 scope 域 https://open.w…

解決ubuntu首次安裝Mysql之后,首次登錄出現ERROR 1698 (28000): Access denied for user 'root'@'localhost'的方法

解決步驟: 1.打開終端,輸入sudo vi /etc/mysql/debian.cnf 打開/etc/mysql/debian.cnf文件,顯示如下: 2.mysql -udebian-sys-maint -p 打開mysql 輸入密碼為上圖中password字段 3.修改root密碼 ALTER USER rootlocalhost IDEN…

六十萬的成長_我的EA策略分析和實現

曾經看過一個故事:在流水線上需要檢測面包盒子是不是空的,科技人員使用各種紅外線等等高科技,達到了目的;有一個工人用一臺風扇就解決了這個問題......其實解決問題可以很簡單,只要能實現目標,過程越簡單越…

流量控制和擁塞控制

流量控制是用于控制調制解調器與計算機之間的數據流,具有防止因為計算機和調制解調器之間通信處理速度的不匹配而引起的數據丟失。通常有硬件流量控制(RTS/CTS)和軟件流量(XON/XOFF)控制。 擁塞現象是指到達通…

內聚的極限: 軟件開發的不確定性原理

高內聚是有極限的. 當代碼在一個維度上高度內聚的時候, 在其它維度上是發散的. -- 代碼內聚設計的不確定性原理 大家都知道量子力學的不確定性原理: 在微觀世界里, 有幾對物理量不能同時精確的測定, 包括速度與位置, 以及能量與時間. 比如當我們精確的測定一個粒子的速度使其誤…

python獲取window共享目錄列表_利用Python獲取DICOM RTstructure勾畫列表

在《利用Python打開DICOM CT文件》一文中,我們利用pydicom.dcmread()讀取了CT圖像。本文中我們將修改load_scan()函數來讀取RTstructure文件并獲取勾畫列表1. 打開Jupyter notebook,導入需要的科學包import numpy as npimport mathimport pydicomimport …

sublime 自定義快捷鍵

[{ "keys": ["altspace"], "command": "auto_complete" }, // 自動提示、補全{ "keys": ["ctrlalti"], "command": "reindent" }, //整理代碼快捷鍵{ "keys": ["f12"…

Ubuntu中安裝、生成、導入、導出、Python3虛擬環境

1.安裝Ubuntu虛擬環境、以及可以支持虛擬環境的模塊 sudo apt install virtualenv sudo apt install virtualenvwrapper 安裝完成之后,進入home目錄,輸入命令ls -al查看是否出現.virtualenvs目錄,如果沒有則手動創建.virtualenvs目錄 重要…

Coursera課程 Programming Languages, Part C 總結

碎言碎語 和前面的 ML 和 Racket 感覺明顯不一樣了,一邊學著一邊覺得這真是一門奇怪的語言,有著各種奇怪的語法,不過真的算是一個奇妙的體驗(相比前面的兩門語言,Ruby 的學習資源多了不少)。week 1 的作業直…

如何判斷網絡是否進入擁塞狀態

通過觀察網絡的吞吐量與網絡負載間的關系 如果隨著網絡負載的增加,網絡的吞吐量明顯小于正常的吞吐量,那么網絡就進入例如輕度擁塞的狀況。 如果網絡得吞吐量隨著網絡負載的增大反而下降,那么網絡就可能進入擁塞狀態。 如果網絡的負載繼續…

如何拷貝工程_如何將premiere的工程及素材文件打包?

我們在剪輯視頻的時候經常會遇到素材丟失的情況,或者說需要換地方或換電腦繼續剪輯。特別是以前做的視頻現在需要修改一些地方,然后打開工程文件會發現素材丟失,如圖:這種情況要不就是素材已經刪除,要不就是素材改變了…

邁出從3K到1W的重要一步——掌握設計模式

IT職場的小菜經常有這樣的疑問: 為什么一個相似的功能,大牛一會兒就搞定,然后悠閑地品著下午茶逛淘寶;而自己加班加點搞到天亮還做不完。 為什么用戶提出需求變更后,大牛只需瀟灑地敲敲鍵盤,改改配置&#…

使用pip安裝virtualenv時出現問題

使用pip出現問題 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安裝pip fxd0…