白話HTTPS

滴水微瀾發表於2018-11-09
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報文,通知伺服器斷開連結。

 

 
 

相關文章