[java][網路程式設計]白話HTTPS

加瓦一枚發表於2019-03-04

HTTPS是傳輸協議嗎?

HTTPS與HTTP有什麼關係?

HTTPS為什麼會安全?

 

閒扯一下

 

Mac筆記本、Windows桌上型電腦、Linux主機。像這三種型別,它們硬體不同,系統不同,服務端處理的程式語言不同。它們之間卻可以在網路的世界了自由聯通。靠的是什麼呢?靠的是它們遵守相同的規則(如:HTTP)。應用層用什麼格式(語言編碼,報文欄位)封裝報文、傳輸層如何將大量的資料分段,並給每幀資料新增編號和埠資訊、網路層如何給沒幀資料新增IP地址,目標MAC地址、資料鏈路層如何將數字資訊通過網路卡發出去。

 

HTTPS是傳輸協議嗎?

 

目前常見的應用層協議

好像沒有看到HTTPS啊?

沒錯,HTTPS並非TCP/IP協議族中的一員,它其實是HTTP協議+SSL協議的組合體,是披著SSL外衣的HTTP。

 

HTTPS與HTTP有什麼關係?

 

HTTP實現的功能:一種機制簡單(這也是從早期眾多傳輸協議中走出來的原因)的超文字傳輸協議,為客戶端和伺服器通訊服務,是處在TCP/IP協議族中的應用層協議。

 

HTTP在傳送請求時,採用四層架構。

應用層:提供多種應用服務,如:HTTP  FTP  DNS等,可以直接提供給開發者使用。

傳輸層:網路間資料的傳輸,如:TCP TDP,報文資料分割打包成幀

網路層:處理網路中流動的資料包,在複雜的網路段中選擇一條傳輸路線,將資料包送到目的地。將現實中的寄快遞(在快遞上寫上收件地址等資訊,送到快遞點(類似於路由器))

資料鏈路層:處理連結網路的硬體部分,如:網路介面卡,硬體驅動,作業系統,光纖。

 

 

 

HTTP請求過程中的重要概念! 

 

1.資料包在網路層怎麼走的呢?

在資料包傳輸過程中,需要不斷使用地址解析協議(IP和MAC地址對應的表,互相反查),進行路由選擇(將資料包丟給一個路由器,路由器會根據資料包上帶的地址,自動分揀,傳給它認為比較好的下一站路,直到到達目的地)

 

2.TCP通訊三次握手

客戶端先傳送一個SYN(synchronize)

服務端收到後,返回一個SYN(synchronize)/ACK(acknowledgement)

客戶端傳送一個ACK(acknowledgement)

 

3.DNS域名解析服務:在瀏覽器輸入url後,點選enter。

1.網路首先會拿填寫的域名到dns伺服器查詢對應的IP地址。

2.瀏覽器將請求傳給返回的IP地址。

 

4.HTTP與HTTPS通訊的區別

只是在應用層與傳輸層之間新增了一個SSL層

 

HTTPS為什麼會安全?

既然HTTPS是披著SSL外衣的HTTP,那SSL是什麼呢?

SSL是安全套接字層,是目前比較成熟的提供可靠資料傳輸的安全協議。SSL可以提供證書認證,資料加密,完整性保護等保護性策略。

 

資料加密原理

SSL採用的加密策略是:非對此加密+對稱加密的混合加密方式

對成加密:單純的對稱加密,加密解密的效率高,但是在客戶端於服務端共享金鑰時,容易被中間劫持洩露,不夠安全

非對稱加密:是新一代加密方案,加密解密銷量低,但是可以實現金鑰的安全傳輸,想通過公鑰解出私鑰難道極大,基本不可能。

 

最中採用在第一次交換共享金鑰時,使用非對稱加密。然後用共享金鑰加密。這樣既避免了金鑰被劫持,又保證了效率

 

資料完整性策略

採用報文摘要的策略,防止報文主題被修改

在報文傳送前,先通過md5-base64加密,得到一個報文主體的摘要,把這個摘要放到請求首部中,等伺服器收到資訊,採用同樣的演算法,加密報文主體,根據得到的結果是否和報文摘要一致來判斷資料的完整性。

 

SSL和TLS的關係

目前常見的加密協議有兩個SSL3.0和TLS1.0,它們之間有什麼區別呢?

 SSL(Secure Socket Layer):是有瀏覽器開發商網景通訊公司發起並開發到了SSL3.0版本

 TLS(Transport Layer Security):後面主導權移交給了IETF組織,他們在SSL3.0基礎上開發了 TLS一系列版本。它們是“父子”關係。

 

HTTPS協議安全通訊步驟

HTTPS協議安全通訊步驟中有三個主角元素:客戶端,伺服器,第三方可信任的證書頒發機構

過程如下:

1.伺服器的運維人員向“第三方可信任的證書頒發機構”提供公司的有效資訊+公鑰。

2.“第三方可信任的證書頒發機構”認證公司有效,就用“第三方可信任的證書頒發機構”的私鑰給伺服器的公鑰簽名,然後建立一個證書,證書中加入了公鑰+公鑰簽名結果,發給伺服器。伺服器運營人員需要支付一定的費用。

3.客服端安裝瀏覽器,瀏覽器內部內建了“第三方可信任的證書頒發機構”的根證書,裡面包含了“第三方可信任的證書頒發機構”的公鑰資訊

//正式開始SSL通訊

4.客戶端傳送請求給ClientHello到伺服器,請求報文中包含客戶端支援的SSL指定版本號,加密元件列表(使用的加密演算法和金鑰長度)

5.服務端收到請求後,也回發生個ClientHello回應,裡面包含了使用的SSL版本和加密元件(該加密元件是從客戶端發生的列表中篩選出來的)

6.緊接著伺服器發生證書報文(Certificate),將伺服器申請的公鑰證書傳給客戶端

7.然後伺服器發生一個Server Hello Done報文給客戶端,表示初期階段的SSL握手協商結束。

 

8.客戶端收到伺服器發來的公鑰證書後,拿本地儲存的第三方機構根證書中的公鑰對證書中的簽名資訊解密,如果解密的結構同證書中的原始伺服器公鑰資訊一樣,證明伺服器可信。

9.接著客戶端在本地生成一個隨機密碼字串。用伺服器的公鑰加密這個字串,將得到的結果傳遞給伺服器器。

10.然後客戶端再傳送一個Change Cipher Spec報文(修改加密規則說明)給伺服器,告訴伺服器下面的通訊將採用剛才的隨機密碼字串作為加密金鑰。

11.最後客戶端發生一個Finish報文,報文中包含了從連線到現在所有報文的整體校驗碼,上面一系列的握手協商是否能最後成功,就看伺服器能否正確解密這個Finish報文了。

 

12.伺服器正確解密後,也傳送個Change Cipher Spec報文(修改加密規則說明)給客戶端。

13.最後服務端也傳送個Finish報文讓客戶端解密驗證。

 

14.等客戶端、伺服器兩者的Finished報文都正常交換後,SSL連線算是正式建立完成。下面的通訊就會受到SSL的加密保護。

15.現在客戶端就可以安全的給伺服器傳送簡單的應用層協議(http)了,並得到受保護的響應

 

16.最後通訊完成,由客戶端傳送close_notify報文,通知伺服器斷開連結。

相關文章