HTTPS理論基礎

我們知道,HTTP請求都是明文傳輸的,所謂的明文指的是沒有經過加密的信息,如果HTTP請求被黑客攔截,並且裏面含有銀行卡密碼等敏感數據的話,會非常危險。爲了解決這個問題,Netscape 公司制定了HTTPS協議,HTTPS可以將數據加密傳輸,也就是傳輸的是密文,即便黑客在傳輸過程中攔截到數據也無法破譯,這就保證了網絡通信的安全。

密碼學基礎

在正式講解HTTPS協議之前,我們首先要知道一些密碼學的知識。

明文: 明文指的是未被加密過的原始數據。

密文:明文被某種加密算法加密之後,會變成密文,從而確保原始數據的安全。密文也可以被解密,得到原始的明文。

密鑰:密鑰是一種參數,它是在明文轉換爲密文或將密文轉換爲明文的算法中輸入的參數。密鑰分爲對稱密鑰與非對稱密鑰,分別應用在對稱加密和非對稱加密上。

對稱加密:對稱加密又叫做私鑰加密,即信息的發送方和接收方使用同一個密鑰去加密和解密數據。對稱加密的特點是算法公開、加密和解密速度快,適合於對大數據量進行加密,常見的對稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。 
其加密過程如下:明文 + 加密算法 + 私鑰 => 密文 
解密過程如下:密文 + 解密算法 + 私鑰 => 明文 
對稱加密中用到的密鑰叫做私鑰,私鑰表示個人私有的密鑰,即該密鑰不能被泄露。 
其加密過程中的私鑰與解密過程中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之爲“對稱”的原因。由於對稱加密的算法是公開的,所以一旦私鑰被泄露,那麼密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難。

非對稱加密:非對稱加密也叫做公鑰加密。非對稱加密與對稱加密相比,其安全性更好。對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那麼整個通信就會被破解。而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現。私鑰被自己保存,不能對外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個進行加密,用另一個進行解密。 
被公鑰加密過的密文只能被私鑰解密,過程如下: 
明文 + 加密算法 + 公鑰 => 密文, 密文 + 解密算法 + 私鑰 => 明文 
被私鑰加密過的密文只能被公鑰解密,過程如下: 
明文 + 加密算法 + 私鑰 => 密文, 密文 + 解密算法 + 公鑰 => 明文 
由於加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因。 
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。 
在非對稱加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密算法)等。

HTTPS通信過程

HTTPS協議 = HTTP協議 + SSL/TLS協議,在HTTPS數據傳輸的過程中,需要用SSL/TLS對數據進行加密和解密,需要用HTTP對加密後的數據進行傳輸,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。

SSL的全稱是Secure Sockets Layer,即安全套接層協議,是爲網絡通信提供安全及數據完整性的一種安全協議。SSL協議在1994年被Netscape發明,後來各個瀏覽器均支持SSL,其最新的版本是3.0

TLS的全稱是Transport Layer Security,即安全傳輸層協議,最新版本的TLS(Transport Layer Security,傳輸層安全協議)是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協議,它建立在SSL 3.0協議規範之上,是SSL 3.0的後續版本。在TLS與SSL3.0之間存在着顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。雖然TLS與SSL3.0在加密算法上不同,但是在我們理解HTTPS的過程中,我們可以把SSL和TLS看做是同一個協議。

HTTPS爲了兼顧安全與效率,同時使用了對稱加密和非對稱加密。數據是被對稱加密傳輸的,對稱加密過程需要客戶端的一個密鑰,爲了確保能把該密鑰安全傳輸到服務器端,採用非對稱加密對該密鑰進行加密傳輸,總的來說,對數據進行對稱加密,對稱加密所要使用的密鑰通過非對稱加密傳輸。


HTTPS在傳輸的過程中會涉及到三個密鑰:

服務器端的公鑰和私鑰,用來進行非對稱加密

客戶端生成的隨機密鑰,用來進行對稱加密

一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分爲8步:

客戶端向服務器發起HTTPS請求,連接到服務器的443端口。

服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存着私鑰,不能將其泄露,公鑰可以發送給任何人。

服務器將自己的公鑰發送給客戶端。

客戶端收到服務器端的公鑰之後,會對公鑰進行檢查,驗證其合法性,如果發現發現公鑰有問題,那麼HTTPS傳輸就無法繼續。嚴格的說,這裏應該是驗證服務器發送的數字證書的合法性,關於客戶端如何驗證數字證書的合法性,下文會進行說明。如果公鑰合格,那麼客戶端會生成一個隨機值,這個隨機值就是用於進行對稱加密的密鑰,我們將該密鑰稱之爲client key,即客戶端密鑰,這樣在概念上和服務器端的密鑰容易進行區分。然後用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束。

客戶端會發起HTTPS中的第二個HTTP請求,將加密之後的客戶端密鑰發送給服務器。

服務器接收到客戶端發來的密文之後,會用自己的私鑰對其進行非對稱解密,解密之後的明文就是客戶端密鑰,然後用客戶端密鑰對數據進行對稱加密,這樣數據就變成了密文。

然後服務器將加密後的密文發送給客戶端。

客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的數據。這樣HTTPS中的第二個HTTP請求結束,整個HTTPS傳輸完成。

數字證書

通過觀察HTTPS的傳輸過程,我們知道,當服務器接收到客戶端發來的請求時,會向客戶端發送服務器自己的公鑰,但是黑客有可能中途篡改公鑰,將其改成黑客自己的,所以有個問題,客戶端怎麼信賴這個公鑰是自己想要訪問的服務器的公鑰而不是黑客的呢? 這時候就需要用到數字證書。

在講數字證書之前,先說一個小例子。假設一個鎮裏面有兩個人A和B,A是個富豪,B想向A借錢,但是A和B不熟,怕B借了錢之後不還。這時候B找到了鎮長,鎮長給B作擔保,告訴A說:“B人品不錯,不會欠錢不還的,你就放心借給他吧。” A聽了這話後,心裏想:“鎮長是全鎮最德高望重的了,他說B沒問題的話那就沒事了,我就放心了”。 於是A相信B的爲人,把錢借給了B。

與此相似的,要想讓客戶端信賴公鑰,公鑰也要找一個擔保人,而且這個擔保人的身份必須德高望重,否則沒有說服力。這個擔保人的就是證書認證中心(Certificate Authority),簡稱CA。 也就是說CA是專門對公鑰進行認證,進行擔保的,也就是專門給公鑰做擔保的擔保公司。 全球知名的CA也就100多個,這些CA都是全球都認可的,比如VeriSign、GlobalSign等,國內知名的CA有WoSign。

那CA怎麼對公鑰做擔保認證呢?CA本身也有一對公鑰和私鑰,CA會用CA自己的私鑰對要進行認證的公鑰進行非對稱加密,此處待認證的公鑰就相當於是明文,加密完之後,得到的密文再加上證書的過期時間、頒發給、頒發者等信息,就組成了數字證書。

不論什麼平臺,設備的操作系統中都會內置100多個全球公認的CA,說具體點就是設備中存儲了這些知名CA的公鑰。當客戶端接收到服務器的數字證書的時候,會進行如下驗證:

首先客戶端會用設備中內置的CA的公鑰嘗試解密數字證書,如果所有內置的CA的公鑰都無法解密該數字證書,說明該數字證書不是由一個全球知名的CA簽發的,這樣客戶端就無法信任該服務器的數字證書。

如果有一個CA的公鑰能夠成功解密該數字證書,說明該數字證書就是由該CA的私鑰簽發的,因爲被私鑰加密的密文只能被與其成對的公鑰解密。

除此之外,還需要檢查客戶端當前訪問的服務器的域名是與數字證書中提供的“頒發給”這一項吻合,還要檢查數字證書是否過期等。

通過瀏覽器直接獲取服務器的公鑰很容易,各個瀏覽器操作大同小異。百度現在已經實現了全站點HTTPS,我們就以百度爲例如何從Chrome中獲取其公鑰。

用Chrome打開百度首頁,在https左側我們會發現有一個綠色的鎖頭。 

這裏寫圖片描述
點擊該鎖頭,出現一個彈出面板,點擊面板中的“詳細信息”幾個字。 

這裏寫圖片描述
這是會打開Chrome的Developer Tool,並自動切換到Security這個頁面。 

這裏寫圖片描述
點擊“View ceertificate”按鈕就可以查看該網站的證書了,如下所示: 

這裏寫圖片描述
在“常規”這個面板中,我們從中可以查看該證書是又Symantec頒發給baidu.com這個網站的,有效期是從2015年9月17到2016年9月1日。

切換到“詳細信息”面板,可以查看證書的一些詳細信息,比如證書所使用的數字簽名的算法,如下圖所示: 

這裏寫圖片描述
上面有個“複製到文件”的按鈕,點擊該按鈕就可以將百度的數字證書導出成文件,從而我們就可以保存到自己的機器上,界面如下所示:

這裏寫圖片描述

這裏寫圖片描述

我們將其導出成X.509格式的證書,以.cer作爲文件擴展名,最後保存到本地機器如下所示: 

這裏寫圖片描述


切換到“證書路徑”面板,可以查看證書的證書鏈。 

這裏寫圖片描述

這裏先解釋一下什麼是證書鏈。我們之前提到,VeriSign是一個全球知名的CA,但是一般情況下,CA不會用自己的私鑰去直接簽名某網站的數字證書,一般CA會首先簽發一種證書,然後用這種證書再去簽發百度等的數字證書。在此例中,VeriSign簽發了Symantec證書,然後Symantec又簽發了baiduc.om,VeriSign位於最頂端,類似於根結點,因此叫做根CA,Symatec位於中間,叫做中間CA,當然,有可能有多箇中間CA,這樣從根CA到中間CA,再到最終的網站的證書,這樣自上而下形成了一條證書鏈。如果想要查看證書鏈中的某個證書,只需要選中它,比如選中了Symantec,然後點擊下面的“查看證書”按鈕就會彈出另一個對話框,在其中可以查看Symantec的數字證書,當然也可以將其導出成證書文件保存在硬盤上。
 

來源於https://blog.csdn.net/iispring/article/details/51615631

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章