面試官問 HTTPS 是怎麼從 HTTP 轉過來的,我有點懵

2021.11.05

這段時間畢竟也是 “金九銀十” 的面試的黃金季節,阿粉當然也想去面試,但是因為自身受限,所以只能採訪一下出去面試的同學們都問了什麼內容,其中有一個,阿粉覺得有必要給大家分享一下,就是問關於 HTTP 的內容。


這段時間畢竟也是 “金九銀十” 的面試的黃金季節,阿粉當然也想去面試,但是因為自身受限,所以只能採訪一下出去面試的同學們都問了什麼內容,其中有一個,阿粉覺得有必要給大家分享一下,就是問關於 HTTP 的內容。

 

HTTP

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。 HTTP 是基於 TCP/IP 協議通信協議來傳遞數據(HTML 文件、圖片文件、查詢結果等)。它不涉及數據包(packet)傳輸,主要規定了客戶端和服務器之間的通信格式,默認使用80端口。

 

這其實就是百度百科里面的精簡化的內容,雖然說不上太細緻,但是已經算是對HTTP做了一個大概的描述,我們接下來就從以下的幾個方面來看一下這個HTTP吧。

 

我們從這裡就不再多解釋 HTTP報文 主體 這些內容了,阿粉之前也是完整的給大家解釋過了,包括了 HTTP 的進化歷史,阿粉今天我們來講講 HTTP HTTPS 的關係。

 

HTTP缺點

眾所周知,HTTP 的優點那可是一大堆:

 

簡單、靈活、易於擴展

 

應用廣泛、環境成熟

 

無狀態 (不需要額外的資源來記錄狀態信息)

 

但是 HTTP 的缺點也是非常的顯著,為什麼這麼說,HTTP 使用的是明文的方式進行傳輸,雖然方便了我們的調試,但是信息會被暴露出來,每一個環節沒有隱私可言。

 

而且 HTTP 在我們的認知當中,他就是一個不安全的,第一個原因是上面說的明文,還有就是 HTTP 不驗證通信雙方的身份,所以對方的身份有可能偽裝,就像某些公共場所的那些 公共WIFI ,還有就是 HTTP 不能驗證報文的完整性,所以報文也是有可能被篡改的。

 

基於這些內容,所以我們很多時候對 HTTP 的選擇都比較慎重,不然你傳輸內容的時候,別人用抓包工具就很容易的能夠分析出你想要傳遞的內容。

 

這時候我們就想到了一個事情,加密處理一下不就好了?

 

對,完全沒問題,HTTP 沒有加密的機制,但是我們可以想辦法處理,這個辦法就是:

 

SSL 或者 TLS

 

SSL: 安全套接層

 

TLS:安全層傳輸協議

當他們組合使用的時候,就能夠加密 HTTP 的通信的內容了,這時候就能在這條線路上進行通信,而通過 SSL組合使用後的 HTTP 被稱為 HTTPS 或者稱之為 HTTP overSSL

 

HTTPS

大白話說一下,HTTP 在加上加密處理和認證以及完整性保護之後就是 HTTPS

 

分辨 HTTPS 最簡單的方法就是,你在瀏覽器訪問的時候,能夠看到一個小鎖的標識。


現在百分之90以上的網站不都是使用的 HTTPS 麼,

 

我們使用抓包工具來看一下 HTTPS 的傳輸內容試試。


我們從中看到了TLS 的版本,還有阿粉沒有截圖上的隨機數。

 

這時候我們就得來完整的分析 HTTPS 的安全通信機制了。來看個圖看一下 然後我們再拿我們的抓包工具來進行分析。

 

上面這是 HTTPS 的安全通信的機制,我們分別來看看都乾了什麼。

 

第一步:Client Hello

 

客戶端通過 發送 Client Hello 報文開始 SSL/TSL 通信。其中包含了 SSL/TSL 的版本,所使用的加密的方法等一系列的內容。

 

第二步:Server Hello

 

服務端根據客戶端發送的支持的 SSL/TLS 協議版本,和自己的比較確定使用的 SSL/TLS 協議版本。缺點假面算法等內容。

 

第三步:服務器發送 Certificate 報文,報文中包含了公開密鑰證書。

 

證書的目的實際上就是保證標識的身份,證書一般採用X.509標準。

第四步:Server Key Exchange

 

服務器發送 Server Hello Done 報文請求客戶端,第一階段的 SSL/TSL 握手協商部分結束。

 

也有很多人習慣的稱第四步是 Server Hello Done 實際上當我們抓包的時候,發現他們是在一次請求中的,我們一會抓包看一下試試。 Server Hello Done 實際上就是相當於我給你說我這邊發完畢了。

 

第五步:Client Key Exchange

 

完成 SSL/TSL 第一次握手之後,客戶端就發送 Client Key Exchange 報文作為回應,這裡實際上就是為了交換秘鑰參數,


這裡客戶端會再生成一個隨機數,然後使用服務端傳來的公鑰進行加密得到密文PreMaster Key。服務端收到這個值後,使用私鑰進行解密,這樣兩邊的秘鑰就協商好了。後面數據傳輸就可以用協商好的秘鑰進行加密和解密。

 

第六步:Change Cipher Spec

 

客戶端發送 Change Cipher Spec 報文,提示服務器編碼改變,就是說以後我們再發消息的時候,我是用之前我們定義的密鑰進行加密。

 

第七步:Client Finished

 

戶端將前面的握手消息生成摘要再用協商好的秘鑰加密,這是客戶端發出的第一條加密消息,這一步也是比較關鍵的一步,這次的操作的成功與否,就得看服務器是否能夠成功解密這次的報文來作為判斷依據了。

 

第八步:服務器發送 Change Cipher Spec

 

第九步:服務器發送Server Finished 報文

 

實際上作用和 Client 差不多。

第十步:服務端和客戶端的 Finished 交換完成了,這時候 SSL/TSL 的連接就OK了,發送信息也就是完整的稱為 HTTPS 了。

 

最後就是進行數據傳輸的內容了。

 

既然 HTTPS 都是安全的了,為什麼不大範圍的廣泛使用呢?

 

實際上加密通信雖然在一定程度上保護了數據的隱私,但是效率比較低,每一次通信都要加密,會消耗資源,如果包含一些錢的肯定那必須得使用加密的通信,而且主要證書要收費呀。

 

你要想用,那肯定需要證書,就像大家在做微信支付的時候,不是也需要購買證書麼,一般一年怎麼也得幾百塊錢,所以你知道 HTTP HTTPS 的關係了麼?