HTTPS 詳細解析 (超詳細,半小時搞懂HTTPS)


https S 代表的是SSL/TLS

先做個實驗: 在瀏覽器的地址欄上輸入 http:\\www.meituan.com  

用http header LIVE  抓個包如下

 

過程如下:

瀏覽器先以HTTP協議來連接服務器。服務器因配置了HTTPS,所以使用了302跳轉至https頁面,瀏覽器再去連接服務器的443端口。

上述小實驗只是https步驟的第一步 ,接下來先進行TCP三次握手,然后進行SSL/TLS四次握手

接下來就是難點了。再講難點之前,先講難點細分討論  

什么是對稱加密

只有一個密鑰,它可以對內容進行加密,也可以用該密鑰對密文進行解密。

但問題來了,密鑰如何保護呢?  

什么是公鑰加密  (非對稱加密)

有兩把密鑰,一把公鑰,一把私鑰,公鑰加密的內容必須用私鑰才能解開,私鑰加密的內容必須用公鑰解開

單個公鑰私鑰,只能保障單方向的安全性,為什么這么說呢

服務器將他的公鑰明文發送給瀏覽器,瀏覽器將數據用公鑰加密發給服務器,只有服務器有私鑰可以查看數據。

服務器將數據用私鑰加密發送給瀏覽器,瀏覽器用公鑰解密

想想看,公鑰是一開始是明文傳輸的,意味着只要截獲了公鑰就可以查看服務器發送的消息,那怎樣可以保障雙方向的通信安全呢?

服務器一對公鑰私鑰,瀏覽器一對公鑰私鑰

服務器明文傳輸自己的公鑰A給瀏覽器,瀏覽器明文傳輸自己的公鑰B給服務器

以后瀏覽器給服務器發送的數據都用公鑰A加密,服務器給瀏覽器發送的數據用公鑰B加密,這樣就保障了雙向通信的安全性

但非對稱性加密非常耗時,如何解決呢 ?

對稱加密+非對稱加密結合

瀏覽器用公鑰A將自己的對稱密鑰X發送給服務器

服務器用私鑰A解密獲得對稱密鑰X

雙方用對稱密鑰X進行數據交換

這樣看起來很安全,但其實還要一個小問題

在發送自己的公鑰給對面時,有個中間人截獲雙方的公鑰,並且把自己的公鑰發送給瀏覽器和服務器

這時候中間人就可以收到用中間人的公鑰加密的對稱密鑰X,這樣看來,還是很危險,客戶端根本不知道接受的公鑰是否可信

數字證書

數字證書是網站的身份證,有了證書就可以證明該網站的合法性;

網站在使用HTTPS之前,需要向CA機構申請一份數字證書,數字證書里有持有者和網站公鑰的信息,服務器只需要把證書傳給瀏覽器即可

但如何證明證書的真偽性呢?

數字簽名

把證書的內容生成一份簽名,對比證書的內容和簽名是否一致

簽名如何制作呢: 將證書的明文信息用hash函數加密一次得到一個固定長度的序列,稱消息摘要,哈希值,然后CA用私鑰進行加密得數字簽名   明文和數字簽名組成數字證書

如何驗證呢:用CA機構的公鑰對數字簽名進行解密,得到哈希值,用證書里的hash算法對證書明文進行hash ,查看兩次得到的hash是否相同

CA公鑰是否可信?

操作系統,瀏覽器會默認安裝信任的證書,證書里包含信任的公鑰

 

現在來理解一下四次握手:

 

1.創建一個屬於瀏覽器與服務器之間的session,避免多次重復驗證

2.服務器將自己的證書發送給瀏覽器

3.瀏覽器發送對稱密鑰給服務器

4.安全的會話建立,數據采用私鑰加密

 

https中涉及的數據包

client hello報文:

TSL版本

SID(session id):保持會話;擴展:不過只保留在一台服務器上,如果請求域名的流量很大的時候,往往右很多的服務器提供服務,就無法恢復對話。采用session ticket

密文族:密鑰交換算法-對稱加密算法-哈希算法

server_name:請求訪問的域名

 

服務器在收到client hello報文后,會回復三個數據包

server hello:session id 、選擇的密文族、選擇的TSL版本

Certificate報文:服務器的數字證書

server hello done 和server key exchange

 

客戶端驗證證書的真偽: 根據數字簽名

 

密鑰交換:客戶端通過服務器的證書將非對稱加密的密鑰發送給服務器

 

到此建立TSL連接結束了 ,其中還要很多細節之處由於水平有限,未能提出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM