<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          記住看小電影前一定要檢查一下域名是不是 HTTPS 的,不然……

          共 2992字,需瀏覽 6分鐘

           ·

          2020-12-12 23:51

          來自:https://segmentfault.com/a/1190000023936425


          1. HTTP 協(xié)議

          在談?wù)?HTTPS 協(xié)議之前,先來回顧一下 HTTP 協(xié)議的概念。

          1.1 HTTP 協(xié)議介紹

          HTTP 協(xié)議是一種基于文本的傳輸協(xié)議,它位于 OSI 網(wǎng)絡(luò)模型中的應(yīng)用層。

          HTTP 協(xié)議是通過客戶端和服務(wù)器的請求應(yīng)答來進(jìn)行通訊,目前協(xié)議由之前的 RFC 2616 拆分成立六個(gè)單獨(dú)的協(xié)議說明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通訊報(bào)文如下:

          請求

          POST http://www.baidu.com HTTP/1.1Host: www.baidu.comConnection: keep-aliveContent-Length: 7User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
          wd=HTTP

          響應(yīng)

          HTTP/1.1 200 OKConnection: Keep-AliveContent-Encoding: gzipContent-Type: text/html;charset=utf-8Date: Thu, 14 Feb 2019 07:23:49 GMTTransfer-Encoding: chunked
          <html>...html>

          1.2 HTTP 中間人攻擊

          HTTP 協(xié)議使用起來確實(shí)非常的方便,但是它存在一個(gè)致命的缺點(diǎn):不安全。

          我們知道 HTTP 協(xié)議中的報(bào)文都是以明文的方式進(jìn)行傳輸,不做任何加密,這樣會導(dǎo)致什么問題呢?下面來舉個(gè)例子:

          小明在 JAVA 貼吧發(fā)帖,內(nèi)容為我愛JAVA:

          被中間人進(jìn)行攻擊,內(nèi)容修改為我愛PHP

          小明被群嘲
          可以看到在 HTTP 傳輸過程中,中間人能看到并且修改 HTTP 通訊中所有的請求和響應(yīng)內(nèi)容,所以使用 HTTP 是非常的不安全的。

          1.3 防止中間人攻擊

          這個(gè)時(shí)候可能就有人想到了,既然內(nèi)容是明文那我使用對稱加密的方式將報(bào)文加密這樣中間人不就看不到明文了嗎,于是如下改造:

          雙方約定加密方式

          使用 AES 加密報(bào)文

          這樣看似中間人獲取不到明文信息了,但其實(shí)在通訊過程中還是會以明文的方式暴露加密方式和秘鑰,如果第一次通信被攔截到了,那么秘鑰就會泄露給中間人,中間人仍然可以解密后續(xù)的通信:

          那么對于這種情況,我們肯定就會考慮能不能將秘鑰進(jìn)行加密不讓中間人看到呢?答案是有的,采用非對稱加密,我們可以通過 RSA 算法來實(shí)現(xiàn)。這個(gè)步驟實(shí)際操作也是比較簡單的,在碼匠筆記訂閱號后臺回復(fù)HTTPS就可以查看搭建HTTPS服務(wù)視頻。
          在約定加密方式的時(shí)候由服務(wù)器生成一對公私鑰,服務(wù)器將公鑰返回給客戶端,客戶端本地生成一串秘鑰(AES_KEY)用于對稱加密,并通過服務(wù)器發(fā)送的公鑰進(jìn)行加密得到(AES_KEY_SECRET),之后返回給服務(wù)端,服務(wù)端通過私鑰將客戶端發(fā)送的AES_KEY_SECRET進(jìn)行解密得到AEK_KEY,最后客戶端和服務(wù)器通過AEK_KEY進(jìn)行報(bào)文的加密通訊,改造如下:

          可以看到這種情況下中間人是竊取不到用于AES加密的秘鑰,所以對于后續(xù)的通訊是肯定無法進(jìn)行解密了,那么這樣做就是絕對安全了嗎?
          所謂道高一尺魔高一丈,中間人為了對應(yīng)這種加密方法又想出了一個(gè)新的破解方案,既然拿不到AES_KEY,那我就把自己模擬成一個(gè)客戶端和服務(wù)器端的結(jié)合體,在用戶->中間人的過程中中間人模擬服務(wù)器的行為,這樣可以拿到用戶請求的明文,在中間人->服務(wù)器的過程中中間人模擬客戶端行為,這樣可以拿到服務(wù)器響應(yīng)的明文,以此來進(jìn)行中間人攻擊:


          這一次通信再次被中間人截獲,中間人自己也偽造了一對公私鑰,并將公鑰發(fā)送給用戶以此來竊取客戶端生成的AES_KEY,在拿到AES_KEY之后就能輕松的進(jìn)行解密了。
          中間人這樣為所欲為,就沒有辦法制裁下嗎,當(dāng)然有啊,接下來我們看看 HTTPS 是怎么解決通訊安全問題的。

          2. HTTPS 協(xié)議

          2.1 HTTPS 簡介

          HTTPS 其實(shí)是SSL+HTTP的簡稱,當(dāng)然現(xiàn)在SSL基本已經(jīng)被TLS取代了,不過接下來我們還是統(tǒng)一以SSL作為簡稱,SSL協(xié)議其實(shí)不止是應(yīng)用在HTTP協(xié)議上,還在應(yīng)用在各種應(yīng)用層協(xié)議上,例如:FTP、WebSocket。
          其實(shí)SSL協(xié)議大致就和上一節(jié)非對稱加密的性質(zhì)一樣,握手的過程中主要也是為了交換秘鑰,然后再通訊過程中使用對稱加密進(jìn)行通訊,大概流程如下:


          這里我只是畫了個(gè)示意圖,其實(shí)真正的 SSL 握手會比這個(gè)復(fù)雜的多,但是性質(zhì)還是差不多,而且我們這里需要關(guān)注的重點(diǎn)在于 HTTPS 是如何防止中間人攻擊的。
          通過上圖可以觀察到,服務(wù)器是通過 SSL 證書來傳遞公鑰,客戶端會對 SSL 證書進(jìn)行驗(yàn)證,其中證書認(rèn)證體系就是確保SSL安全的關(guān)鍵,接下來我們就來講解下CA 認(rèn)證體系,看看它是如何防止中間人攻擊的。

          2.2 CA 認(rèn)證體系

          上一節(jié)我們看到客戶端需要對服務(wù)器返回的 SSL 證書進(jìn)行校驗(yàn),那么客戶端是如何校驗(yàn)服務(wù)器 SSL 證書的安全性呢。

          權(quán)威認(rèn)證機(jī)構(gòu)

          在 CA 認(rèn)證體系中,所有的證書都是由權(quán)威機(jī)構(gòu)來頒發(fā),而權(quán)威機(jī)構(gòu)的 CA 證書都是已經(jīng)在操作系統(tǒng)中內(nèi)置的,我們把這些證書稱之為CA根證書:

          簽發(fā)證書

          我們的應(yīng)用服務(wù)器如果想要使用 SSL 的話,需要通過權(quán)威認(rèn)證機(jī)構(gòu)來簽發(fā)CA證書,我們將服務(wù)器生成的公鑰和站點(diǎn)相關(guān)信息發(fā)送給CA簽發(fā)機(jī)構(gòu),再由CA簽發(fā)機(jī)構(gòu)通過服務(wù)器發(fā)送的相關(guān)信息用CA簽發(fā)機(jī)構(gòu)進(jìn)行加簽,由此得到我們應(yīng)用服務(wù)器的證書,證書會對應(yīng)的生成證書內(nèi)容的簽名,并將該簽名使用CA簽發(fā)機(jī)構(gòu)的私鑰進(jìn)行加密得到證書指紋,并且與上級證書生成關(guān)系鏈。

          這里我們把百度的證書下載下來看看:

          可以看到百度是受信于GlobalSign G2,同樣的GlobalSign G2是受信于GlobalSign R1,當(dāng)客戶端(瀏覽器)做證書校驗(yàn)時(shí),會一級一級的向上做檢查,直到最后的根證書,如果沒有問題說明服務(wù)器證書是可以被信任的。
          如何驗(yàn)證服務(wù)器證書
          那么客戶端(瀏覽器)又是如何對服務(wù)器證書做校驗(yàn)的呢,首先會通過層級關(guān)系找到上級證書,通過上級證書里的公鑰來對服務(wù)器的證書指紋進(jìn)行解密得到簽名(sign1),再通過簽名算法算出服務(wù)器證書的簽名(sign2),通過對比sign1和sign2,如果相等就說明證書是沒有被篡改也不是偽造的。


          這里有趣的是,證書校驗(yàn)用的 RSA 是通過私鑰加密證書簽名,公鑰解密來巧妙的驗(yàn)證證書有效性。

          這樣通過證書的認(rèn)證體系,我們就可以避免了中間人竊取AES_KEY從而發(fā)起攔截和修改 HTTP 通訊的報(bào)文。

          總結(jié)

          首先先通過對 HTTP 中間人攻擊的來了解到 HTTP 為什么是不安全的,然后再從安全攻防的技術(shù)演變一直到 HTTPS 的原理概括,希望能讓大家對 HTTPS 有個(gè)更深刻的了解。

          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级a一级a爰免费免免高潮 | 国产精品视频在线播放 | 精品久久123区 | JIZZ国产丝袜19学生 | 俺去也亚洲图区 |