一文科普:白話HTTPS

一文科普:白話HTTPS


  • HTTPS是傳輸協議嗎?
  • HTTPS與HTTP有什麼關係?
  • HTTPS為什麼會安全?

閒扯一下

Mac筆記本、Windows臺式機、Linux主機。像這三種類型,它們硬件不同,系統不同,服務端處理的編程語言不同。它們之間卻可以在網絡的世界了自由聯通。靠的是什麼呢?

靠的是它們遵守相同的規則(如:HTTP)。應用層用什麼格式(語言編碼,報文字段)封裝報文、傳輸層如何將大量的數據分段,並給每幀數據添加編號和端口信息、網絡層如何給沒幀數據添加IP地址,目標MAC地址、數據鏈路層如何將數字信息通過網卡發出去。

HTTPS是傳輸協議嗎?

目前常見的應用層協議

一文科普:白話HTTPS

好像沒有看到HTTPS啊?

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

HTTPS與HTTP有什麼關係?

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

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

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

傳輸層:網絡間數據的傳輸,如:TCP TDP,報文數據分割打包成幀

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

數據鏈路層:處理鏈接網絡的硬件部分,如:網絡適配器,硬件驅動,操作系統,光纖。

一文科普:白話HTTPS

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

1.數據包在網絡層怎麼走的呢?

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

一文科普:白話HTTPS

2.TCP通訊三次握手

  • 客戶端先發送一個SYN(synchronize)
  • 服務端收到後,返回一個SYN(synchronize)/ACK(acknowledgement)
  • 客戶端發送一個ACK(acknowledgement)

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

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

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

4.HTTP與HTTPS通信的區別


一文科普:白話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. 客服端安裝瀏覽器,瀏覽器內部內置了“第三方可信任的證書頒發機構”的根證書,裡面包含了“第三方可信任的證書頒發機構”的公鑰信息
  4. //正式開始SSL通信
  5. 客戶端發送請求給ClientHello到服務器,請求報文中包含客戶端支持的SSL指定版本號,加密組件列表(使用的加密算法和密鑰長度)
  6. 服務端收到請求後,也回發生個ClientHello回應,裡面包含了使用的SSL版本和加密組件(該加密組件是從客戶端發生的列表中篩選出來的)
  7. 緊接著服務器發生證書報文(Certificate),將服務器申請的公鑰證書傳給客戶端
  8. 然後服務器發生一個Server Hello Done報文給客戶端,表示初期階段的SSL握手協商結束。
  9. 客戶端收到服務器發來的公鑰證書後,拿本地存儲的第三方機構根證書中的公鑰對證書中的簽名信息解密,如果解密的結構同證書中的原始服務器公鑰信息一樣,證明服務器可信。
  10. 接著客戶端在本地生成一個隨機密碼字符串。用服務器的公鑰加密這個字符串,將得到的結果傳遞給服務器器。
  11. 然後客戶端再發送一個Change Cipher Spec報文(修改加密規則說明)給服務器,告訴服務器下面的通信將採用剛才的隨機密碼字符串作為加密密鑰。
  12. 最後客戶端發生一個Finish報文,報文中包含了從連接到現在所有報文的整體校驗碼,上面一系列的握手協商是否能最後成功,就看服務器能否正確解密這個Finish報文了。
  13. 服務器正確解密後,也發送個Change Cipher Spec報文(修改加密規則說明)給客戶端。
  14. 最後服務端也發送個Finish報文讓客戶端解密驗證。
  15. 等客戶端、服務器兩者的Finished報文都正常交換後,SSL連接算是正式建立完成。下面的通信就會受到SSL的加密保護。
  16. 現在客戶端就可以安全的給服務器發送簡單的應用層協議(http)了,並得到受保護的響應
  17. 最後通訊完成,由客戶端發送close_notify報文,通知服務器斷開鏈接。
作者:滴水微瀾來源:java知音


分享到:


相關文章: