http、https和數字證書的相關知識

http協議

http協議全稱超文本傳輸協議,是一個基於請求與響應,無狀態的,應用層的協議,常基於TCP/IP協議傳輸數據,互聯網上應用最爲廣泛的一種網絡協議,所有的WWW文件都必須遵守這個標準。設計HTTP的初衷是爲了提供一種發佈和接收HTML頁面的方法。

  • 無狀態:協議對客戶端沒有狀態存儲,對事物處理沒有“記憶”能力,比如訪問一個網站需要反覆進行登錄操作
  • 無連接:HTTP/1.1之前,由於無狀態特點,每次請求需要通過TCP三次握手四次揮手,和服務器重新建立連接。比如某個客戶機在短時間多次請求同一個資源,服務器並不能區別是否已經響應過用戶的請求,所以每次需要重新響應請求,需要耗費不必要的時間和流量。
  • 基於請求和響應:基本的特性,由客戶端發起請求,服務端響應
  • 簡單快速、靈活
  • 通信使用明文、請求和響應不會對通信方進行確認、無法保護數據的完整性

https

對http進行了封裝,http超文本傳輸協議,明文協議,於是容易被獲取重要信息。變採用了基於ssl加密的https協議,用與客戶端、服務器的數據傳輸。因爲http是明文傳輸,所以有數據泄漏的安全問題,由此提出來了https協議,具有一下特點:

  • 內容加密:採用混合加密技術,中間者無法直接查看明文內容
    加密一般都對稱加密和非對稱加密,非對稱加密算法比較消耗時間,所以一般都用非堆成加密算法對對稱加密算法的公鑰加密,保證不別竊取,利用對稱加密算法的公鑰對傳輸內容加密,由此來提高性能。
  • 驗證身份:通過證書認證客戶端訪問的是自己的服務器
    這裏驗證身份主要是在內容加密一節中存在一個問題,實際的網絡環境都有很多代理服務器,如果有人僞裝稱代理服務器,給你發了一個非堆成加密的公鑰,這樣客戶端就把對稱公鑰給發給了代理服務器,這樣客戶端的內容都會被代理服務器所解析出來。所以怎麼驗證一個服務器的身份呢?
  • 保護數據完整性:防止傳輸的內容被中間人冒充或者篡改

數字證書內容包括了:

  • 加密後服務器的公鑰
  • 權威機構的信息
  • 服務器域名
  • 還有經過CA私鑰簽名之後的證書內容
    先通過Hash函數計算得到證書數字摘要,然後用權威機構私鑰加密數字摘要得到數字簽名
  • 簽名計算方法
  • 證書對應的域名

CA機構

兩個機器之間通信,公鑰是公開的,那麼公鑰和機器怎麼對應上?你說A機器的公鑰是這個,但是也可能讓人給改了,改成了別人的公鑰,需要一個國際認證機構來管理和認證,他們來認證公鑰與網站的映射關係。這就是CA機構

數字簽名

我們把證書內容生成一份“簽名”,比對證書內容和簽名是否一致就能察覺是否被篡改。這種技術就叫數字簽名,數字簽名的製作過程:

  • 1、CA擁有非對稱加密的私鑰和公鑰。
  • 2、CA對證書明文信息進行hash。
  • 3、對hash後的值用私鑰加密,得到數字簽名。

這裏的hash其實是MD5、SHA256這樣的算法。明文和數字簽名共同組成了數字證書,這樣一份數字證書就可以頒發給網站了。那瀏覽器拿到服務器傳來的數字證書後,如何驗證它是不是真的?(有沒有被篡改、掉包)
瀏覽器驗證過程:

  • 拿到證書,得到明文T,數字簽名S。
  • 用CA機構的公鑰對S解密(由於是瀏覽器信任的機構,所以瀏覽器保有它的公鑰),得到S’。
    用證書裏說明的hash算法對明文T進行hash得到T’。
  • 比較S’是否等於T’,等於則表明證書可信。

這裏回到剛剛提到的問題:爲什麼製作數字簽名時需要hash一次?
我們是不會覺得以上過程中hash有點多餘,把hash過程去掉也能保證證書沒有被篡改。因爲我們可以對明文加密。說到底還是性能問題,非對稱加密效率較差,加密的內容越多越耗時,證書信息一般較長,比較耗時。而hash後得到的是固定長度的信息(比如用md5算法hash後可以得到固定的128位的值),這樣加密解密就會快很多。也有安全上的考慮,具體可以去參考其他博客。

SSL

在網站通過SSL來與用戶建立安全的通信中,對稱加密算法和非對稱加密算法起到了很大作用。客戶端和服務器的握手階段使用的是非對稱加密算法,傳輸數據節點使用的是對稱算法,這主要是因爲對稱算法效率比非堆成要高。

在握手階段,客戶端、服務器之間會協商纔去的加密方式,客戶端也會提供對稱密鑰,用於雙方加密、解密數據。

https過程

比如你如何確信這個網站是一個好網站?好網站就會有一個“好網站證書”,也就是certification,這個證書是由CA(certificate authority)頒佈的,

  • 客戶端每次鏈接,網站都先去找CA拿一份證書,然後把這個證書一起發給客戶,來證明自己的清白。也許你會問,萬一是一個壞網站自己僞造的證書呢?
  • 然後客戶端、服務端就要決定用什麼方式加密。加密的方式有很多種,比如各種AES啦什麼的。客戶端告訴服務器,我的瀏覽器支持哪些加密方式,然後服務器選擇其中一種,於是你們之間的數據就被加密了,這就是confidentiality。
  • 那怎麼保證你的數據不被修改呢?這就要說到hash,hash算法可以把一個長長的數據變短,一般情況下,不同的長數據變成的短數據,是不一樣的。哪怕長數據裏面只變化了一點點,短數據也會差別很大(專業術語叫avalanche effect)。傳輸數據的時候,把這個短數據一併傳了,對方就可以知道整個數據包是否被修改。當然這需要雙方都提前知道一些並沒有被傳輸的祕密。常用的hash有md5和SHA256等。

客戶端在使用HTTPS方式與Web服務器通信時的步驟

  • (1)客戶使用https的URL訪問Web服務器,要求與Web服務器建立SSL連接。
  • (2)Web服務器收到客戶端請求後,會將網站的證書信息(證書中包含公鑰)傳送一份給客戶端。
  • (3)客戶端的瀏覽器與Web服務器開始協商SSL/TLS連接的安全等級,也就是信息加密的等級。
    這裏其實需要做驗證,驗證證書,驗證比較繁瑣,首先驗證證書機構,證書機構都是預先嵌入到我們的瀏覽器系統中的。這個驗證通過後,驗證證書內容,從瀏覽器中找到CA機構的根公鑰,用這個公鑰去解析證書的簽名得到一個hash值H1,上面提到過,這個簽名是證書發佈之前CA機構用自己的根私鑰加密而成的,所以這裏只能由根證書的根公鑰去解密。然後用證書的指紋算法對證書的內容再進行hash計算得到另一個hash值H2,如果此時H1和H2是相等的,就代表證書沒有被修改過。在證書沒有被修改過的基礎上,再檢查證書上的使用者的URL(比如csdn.net)和我們請求的URL是否相等,如果相等,那麼就可以證明當前瀏覽器連接的網址也是正確的,而不是一些釣魚網之類的。
  • (4)客戶端的瀏覽器根據雙方同意的安全等級,建立會話密鑰,然後利用網站的公鑰將會話密鑰加密,並傳送給網站。公鑰就在證書裏。
  • (5)Web服務器利用自己的私鑰解密出會話密鑰。
  • (6)Web服務器利用會話密鑰加密與客戶端之間的通信。

如果有一個釣魚網站僞裝證書,我們來看下能不能成功,CA機構在頒發證書之前會用自己的私鑰對其加密,所以瀏覽器上的根公鑰纔可以解密,釣魚網站的證書因爲不是私鑰加密,所以根據無法解密,也就得不到假的證書中的信息,不過好像這個公鑰是對證書的簽名進行加密,然後再通過簽名方法對證書內容計算得到新簽名,對比兩個簽名是否一樣來證明證書內容是不是被篡改了

這裏要注意:

  • 客戶端會話公鑰是對傳輸內容加密的。
  • 服務端的公鑰、密鑰是用來對客戶端會話公鑰做加密、解密的,保證會話公鑰傳輸的時候不會被別人盜取。

參考博客

HTTPS的數字證書驗證原理
徹底搞懂HTTPS的加密機制
HTTP與HTTPS的區別詳細介紹及https的優化

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