1. 程式人生 > >使用WireShark深入理解HTTPS原理

使用WireShark深入理解HTTPS原理

前端開發,移動開發,後臺開發,都應該知道HTTP通訊,而且現在一些大廠都已經使用HTTPS進行通訊,那HTTPS到底是什麼呢,有什麼好處呢?

一.為什麼要使用HTTPS

http是一種通訊上極為簡便的協議,他本身不帶有安全功能,http包在網路上傳輸的過程中難免會被人竊聽,篡改甚至攔截。有時候一些比較隱私的資料比如個人賬號密碼身份證號碼,銀行卡賬號密碼,是絕對不能被人知道的,那這個時候該怎麼辦呢?所以這個時候就出現了HTTPS,他不是一種新的協議,是在HTTP和TCP層之間添加了一個SSL層,也就是把HTTP的包,經過加密後,再發給TCP傳輸出去。

二.簡單介紹HTTPS的主要功能

1.身份認證

HTTPS具備身份認證功能,也就是客戶端和服務端在相互通訊的時候,需要互相認證身份(有時候只需要認證服務端身份),才可以建立連線,保證了雙方身份的有效性。

2.加密通訊

把HTTP的報文,主要是報文主體部分,經過對稱加密,把密文部分拿去傳輸,保證了通訊的資料主體不會被洩漏(因為就算被監聽到了,拿到的也是密文,沒有金鑰是無法破解的)

3.資料完整性

三.HTTPS建立連線的9次握手及WireShark抓包分析

1.簡單介紹WireShark抓包使用方法

首先開啟WireShark後雙擊這裡Wi-Fi:en0,就會進入監聽頁面

通過這個圖可以清晰得看到每個請求的Time, Sourece(請求端IP), Destination(接收端IP), Protocol(協議型別), Length, Info。這裡我說清晰的看到,其實也是昧著良心說的,哪裡清晰了,資料一大堆,我請求了一個HTTP請求完全就是石沉大海了,根本找不到嘛。所以最重要的其實還是要會使用過濾器。

先介紹幾種過濾器的常用方法:

1.過濾協議型別

比如我只想看到HTTP請求,就在過濾欄中輸入http那就只看到http相關的請求了。

然後這裡有一個小技巧,HTTP一般是成對出現的, 也就是請求和響應,所以當你點選某一個數據的時候,在最左邊,會出現向右的箭頭和向左的箭頭,這個就是一對請求和響應,這裡是因為請求和響應都在一起,所以看起來沒那麼重要,但是當請求和響應集中爆發的時候,就可以看出他的作用了。

2.根據請求和響應的IP地址來過濾

比如我只想要發給IP為61.151.234.53的請求和響應,那就在過濾欄中輸入“ip.src == 172.28.104.232 and ip.dst == 61.151.234.53”,這樣就把其他的資料都過來掉了。

然後要檢視這些請求的具體報文,就可以點選具體一條看下面的資料

這裡可以看到,Internet Protocol(也就是IP協議,網路層)Transmission Control Protocol(TCP協議,傳輸層) Hypertext Transfer Protocol(HTTP協議,應用層)我們最關係的當然是HTTP層了,可以在這裡看到URI Method及各個Header。

2.HTTPS實現原理簡介

1.要使用HTTPS進行通訊的服務端,需要向CA機構申請數字證書,來證明自己身份的有效性。

2.當客戶端請求的時候,把證書發給客戶端,客戶端驗證證書有效,也就是認證了服務端的有效性,並且拿出數字證書中包含的公鑰

3.客戶端生成一個隨機數,使用公鑰加密,並且傳遞給服務端

4.服務端用私鑰解密,拿到隨機數。之後客戶端和服務端就用這個隨機數進行加密通訊

小結:HTTPS最關鍵的就是使用數字證書來證明伺服器的有效性,然後使用非對稱加密來傳遞對稱加密的金鑰。這裡要說明的是,實際使用中對稱加密的金鑰,並不是直接由客戶端生成的隨機數,這裡為了說明方便而簡單這樣理解。實際上的對稱加密金鑰是要根據協商的加密演算法元件來決定的。

3.祭出一張《圖解HTTP》中關於HTTPS握手的流程圖以及對應的WireShark抓包

這裡我們主要觀察ssl,所以添加了ssl過濾,以及添加了目標IP地址過濾。這裡可以看到,上下兩圖,是基本可以對應上的。

1.Client Hello

這是客戶端傳送請求給服務端

在這裡可以看到,SSL使用的版本是TLSv1.2,然後這裡傳送了一個客戶端生成的隨機數Random,這個在後面會使用到,然後還有Cipher Suites這個是客戶端支援的加密演算法元件,客戶端把這個加密演算法元件發給服務端,服務端會從裡面選出一個最適合的元件來進行加密通訊。

2.Server Hello

這裡可以看到,服務端也返回了一個Random給客戶端,並且把選中的加密演算法元件傳送給客戶端

3.Certificate

這一步是服務端把數字證書發給客戶端

證書中包含了服務端非對稱加密的公鑰,客戶端驗證通過後會取出來,用作後續加密使用

4.Server Key Exchange Serve Hello Done

這一步中的Server Key Exchange是《圖解HTTP》流程圖中缺少的,這一步也是根據具體演算法元件決定的,這裡採用了DH演算法,所以需要服務端傳遞引數到客戶端。

Server Hello Done就是告訴客戶端這一階段結束了。

5.Clinet Key Exchange, Change Cipher Spec, Multiple Handshake Messages

Clinet Key Exchange是客戶端生成隨機數作為pre-master-secret,然後使用剛才從證書中拿到的公鑰進行加密,然後傳遞給服務端。

Change Cipher Spec是客戶端告訴服務端,以後的訊息都是通過加密後的

Multiple Handshake Messages是告訴服務端,這一階段結束了,並且在這一過程中,通過客戶端Random, 服務端Random和pre-master-secret生成了master-secret來作為之後通訊對稱加密的金鑰。

6.Change Cipher Spec Handshake Message

Change Cipher Spec是服務端告訴客戶端,之後的通訊是通過加密後的通訊。

Handshake Message在這個過程中,服務端也通過客戶端Random, 服務端Random和pre-master-secret生成了master-secret來作為之後通訊對稱加密的金鑰。

7.ApplicationData

到了這裡,SSL的握手連線算是完成了,這裡就是試著完成一次HTTP通訊,傳送的資料,也是經過金鑰加密的。在此之後的所有通訊都是通過金鑰加密的。直到斷開連線,下次通訊又需要以上握手連線。