HTTPS加密流程

在網(wǎng)絡(luò)上看了很多文章,感覺(jué)都說(shuō)的不是很完整,很多重要細(xì)節(jié)沒(méi)有交代清楚,所以決定寫(xiě)一篇文章記錄一下學(xué)習(xí)過(guò)程。

概念名詞解釋

HTTPS是什么?
HTTPS其實(shí)就是http secure的意思,也就是HTTP的安全升級(jí)版。HTTP是應(yīng)用層協(xié)議,位于HTTP協(xié)議之下是傳輸協(xié)議TCP。TCP負(fù)責(zé)傳輸,HTTP則定義了數(shù)據(jù)如何進(jìn)行包裝。
HTTP --> TCP (明文傳輸)
HTTPS相對(duì)于HTTP有哪些不同呢?其實(shí)就是在HTTP跟TCP中間加多了一層加密層TLS/SSL。

TLS/SSL是什么?
通俗的講,TLS、SSL其實(shí)是類(lèi)似的東西,SSL是個(gè)加密套件,負(fù)責(zé)對(duì)HTTP的數(shù)據(jù)進(jìn)行加密。TLS是SSL的升級(jí)版?,F(xiàn)在提到HTTPS,加密套件基本指的是TLS。

對(duì)稱(chēng)加密是什么?
加密用的密鑰和解密用的密鑰是一樣的。
優(yōu)點(diǎn):算的快,效率高。
缺點(diǎn):密鑰一旦泄露,等于明文,且容易被篡改,維護(hù)密鑰成本高。
常見(jiàn)算法:AES、DES、TripleDES、RC2、RC4、RC5和Blowfish等

非對(duì)稱(chēng)加密是什么?
密鑰分公鑰和私鑰,通過(guò)公鑰加密的數(shù)據(jù),可以用私鑰進(jìn)行解密。私鑰加密的數(shù)據(jù)用公鑰也可以進(jìn)行解密。一般公鑰是公開(kāi)的,私鑰只保存一份在服務(wù)端。
優(yōu)點(diǎn):加密更安全,只要私鑰不泄露,那么就可以認(rèn)為數(shù)據(jù)是不能被解密的。
缺點(diǎn):計(jì)算成本高,效率低。
常見(jiàn)算法:RSA、DES

CA根證書(shū)是什么?
CA證書(shū)本質(zhì)上也是一個(gè)數(shù)字證書(shū),是用來(lái)驗(yàn)證CA身份的,瀏覽器或者操作系統(tǒng)會(huì)內(nèi)置大多數(shù)主流權(quán)威的CA根證書(shū),里面包含CA的公鑰等信息。

數(shù)字證書(shū)是什么?

數(shù)字證書(shū)部分可以參考:http://www.itdecent.cn/p/3371740b7b02

數(shù)字證書(shū)(digital certificate),又叫做公鑰證書(shū)(public key certificate)或者身份證書(shū)(identity certificate),是一種證明公鑰擁有者的電子文檔。
數(shù)字證書(shū)重要內(nèi)容包括:

  • 公鑰
  • 公鑰擁有者的身份識(shí)別信息
  • 驗(yàn)證本證書(shū)內(nèi)容的的數(shù)字簽名
  • 網(wǎng)站域名
  • 有效期
  • 加密算法

  • 注意:這些內(nèi)容都是明文的,并沒(méi)有加密,很多文章說(shuō)證書(shū)里的公鑰是加密后的,需要用CA根證書(shū)公鑰解密,其實(shí)是錯(cuò)誤的。存儲(chǔ)的時(shí)候是DER 二進(jìn)制存儲(chǔ)或者其他格式。

數(shù)字簽名怎么生成的?

  • 對(duì)證書(shū)關(guān)鍵內(nèi)容(公鑰、有效期、身份識(shí)別信息等)進(jìn)行hash計(jì)算,獲得信息摘要
  • 由證書(shū)頒發(fā)機(jī)構(gòu)的私鑰對(duì)信息摘要進(jìn)行加密貨的數(shù)字簽名
    生成信息摘要部分可以簡(jiǎn)化這么理解,不影響整個(gè)流程。

HTTPS證書(shū)生成

生成

  1. 服務(wù)器管理員生成一對(duì)公鑰和私鑰
  2. 管理員把公鑰傳給證書(shū)頒發(fā)機(jī)構(gòu)CA,然后申請(qǐng)證書(shū)
  3. 證書(shū)中包含上面服務(wù)器的公鑰

客戶(hù)端與服務(wù)器交互流程

參考:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

  1. 首先,客戶(hù)端(通常是瀏覽器)先向服務(wù)器發(fā)出加密通信的請(qǐng)求,這被叫做ClientHello請(qǐng)求。在這一步,客戶(hù)端主要向服務(wù)器提供以下信息。

    • 支持的協(xié)議版本,比如TLS 1.0版。
    • 一個(gè)客戶(hù)端生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰1"。
    • 支持的加密方法。
    • 支持的壓縮方法。
    image.png
  2. 服務(wù)器收到客戶(hù)端請(qǐng)求后,向客戶(hù)端發(fā)出回應(yīng),這叫做SeverHello。服務(wù)器的回應(yīng)包含以下內(nèi)容。

    • 確認(rèn)使用的加密通信協(xié)議版本,比如TLS 1.0版本。如果瀏覽器與服務(wù)器支持的版本不一致,服務(wù)器關(guān)閉加密通信。
    • 一個(gè)服務(wù)器生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰2"。
    • 確認(rèn)使用的加密方法,比如AES對(duì)稱(chēng)加密。
    • 服務(wù)器證書(shū)。
      image.png
  3. 客戶(hù)端收到服務(wù)器回應(yīng)以后,首先驗(yàn)證服務(wù)器證書(shū)。如果證書(shū)不是可信機(jī)構(gòu)頒布、或者證書(shū)中的域名與實(shí)際域名不一致、或者證書(shū)已經(jīng)過(guò)期,就會(huì)向訪問(wèn)者顯示一個(gè)警告,由其選擇是否還要繼續(xù)通信。
    如果證書(shū)沒(méi)有問(wèn)題,客戶(hù)端就會(huì)從證書(shū)中取出服務(wù)器的公鑰。然后,向服務(wù)器發(fā)送下面三項(xiàng)信息。

    這里的公鑰獲取,有的地方說(shuō)是服務(wù)端會(huì)單獨(dú)再發(fā)一次,Server Key Exchange,但都是明文傳遞的,所以這里的細(xì)節(jié)出入并不影響整個(gè)流程的安全性

    • 一個(gè)隨機(jī)數(shù)(pre-master key)。該隨機(jī)數(shù)用服務(wù)器公鑰加密,生成對(duì)話密鑰3,防止被竊聽(tīng)。
    • 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
    • 客戶(hù)端握手結(jié)束通知,表示客戶(hù)端的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來(lái)供服務(wù)器校驗(yàn)。

    驗(yàn)證證書(shū)合法性的大概流程是:
    1、 先獲取證書(shū)中的CA名字,然后從系統(tǒng)中找到對(duì)應(yīng)的根證書(shū),獲得根證書(shū)里的公鑰。如果不是可信任的機(jī)構(gòu)就中斷流程
    2、對(duì)獲取的服務(wù)的證書(shū)的數(shù)字簽名進(jìn)行解密,獲得信息摘要
    3、對(duì)服務(wù)端證書(shū)進(jìn)行同樣算法的hash計(jì)算,和上一步的信息摘要進(jìn)行比較,一致則認(rèn)為沒(méi)有被篡改過(guò)

  4. 服務(wù)器的最后回應(yīng)
    服務(wù)器收到客戶(hù)端的第三個(gè)隨機(jī)數(shù)加密后的對(duì)話密鑰后,用服務(wù)端的私鑰解密獲得pre-master key。
    這時(shí)服務(wù)端和客戶(hù)端分別都有2個(gè)隨機(jī)數(shù)密鑰和一個(gè)pre-master key,三個(gè)密鑰相加再按協(xié)商好的對(duì)稱(chēng)加密算法進(jìn)行加密,獲得本次會(huì)話最終的會(huì)話密鑰。
    然后,向客戶(hù)端最后發(fā)送下面信息。

    • 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
    • 服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來(lái)供客戶(hù)端校驗(yàn)。
  5. 后面的數(shù)據(jù)傳輸都用剛才生成的會(huì)話密鑰進(jìn)行加密傳遞,至此整個(gè)流程結(jié)束。

借用B站up主【技術(shù)蛋老師】的一張圖,b站鏈接:https://www.bilibili.com/video/BV1KY411x7Jp

image.png

一些問(wèn)題

Q:證書(shū)里的公鑰是明文傳遞的,不怕中間人截取嗎?
A:中間人可用截取公鑰,但無(wú)法篡改替換成自己的公鑰,因?yàn)橐坏┬薷?,證書(shū)的數(shù)字簽名就驗(yàn)證不通過(guò)了。

Q:就算不能篡改,三次傳遞的密鑰都是明文的,是不是就能截取服務(wù)端和客戶(hù)端的通信內(nèi)容了呢,這不還是裸奔嗎?
A:三個(gè)密鑰雖然都是明文傳遞的,但第三次的密鑰是用公鑰加密后的,要想生成對(duì)稱(chēng)加密的密鑰,需要先對(duì)第三次的密鑰進(jìn)行解密,但只有私鑰可以解密,公鑰是不能對(duì)自己加密的內(nèi)容進(jìn)行解密的,所以生成的對(duì)稱(chēng)密鑰無(wú)法被破解,數(shù)據(jù)是安全的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容