<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三連問,最后一問難道很多人

          共 3523字,需瀏覽 8分鐘

           ·

          2021-05-23 20:28

          作者 | leapMie

          來源 | http://yoursite.com/archives/418/

          前言

          大家都知道 HTTPS 比 HTTP 安全,也聽說過與 HTTPS 協(xié)議相關(guān)的概念有 SSL 、非對(duì)稱加密、 CA 證書等。

          但對(duì)于以下靈魂三拷問可能就答不上了:

          • 為什么用了 HTTPS 就是安全的?
          • HTTPS 的底層原理如何實(shí)現(xiàn)?
          • 用了 HTTPS 就一定安全嗎?

          本文將層層深入,從原理上把 HTTPS 的安全性講透。

          HTTPS 的實(shí)現(xiàn)原理

          大家可能都聽說過 HTTPS 協(xié)議之所以是安全的是因?yàn)?HTTPS 協(xié)議會(huì)對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,而加密過程是使用了非對(duì)稱加密實(shí)現(xiàn)。

          但其實(shí),HTTPS 在內(nèi)容傳輸?shù)募用苌鲜褂玫氖菍?duì)稱加密,非對(duì)稱加密只作用在證書驗(yàn)證階段。

          HTTPS 的整體過程分為證書驗(yàn)證和數(shù)據(jù)傳輸階段,具體的交互過程如下:

          img

          證書驗(yàn)證階段:

          • 瀏覽器發(fā)起 HTTPS 請(qǐng)求。
          • 服務(wù)端返回 HTTPS 證書。
          • 客戶端驗(yàn)證證書是否合法,如果不合法則提示告警。

          數(shù)據(jù)傳輸階段:

          • 當(dāng)證書驗(yàn)證合法后,在本地生成隨機(jī)數(shù)。
          • 通過公鑰加密隨機(jī)數(shù),并把加密后的隨機(jī)數(shù)傳輸?shù)椒?wù)端。
          • 服務(wù)端通過私鑰對(duì)隨機(jī)數(shù)進(jìn)行解密。
          • 服務(wù)端通過客戶端傳入的隨機(jī)數(shù)構(gòu)造對(duì)稱加密算法,對(duì)返回結(jié)果內(nèi)容進(jìn)行加密后傳輸。

          為什么數(shù)據(jù)傳輸是用對(duì)稱加密?

          首先,非對(duì)稱加密的加解密效率是非常低的,而 HTTP 的應(yīng)用場(chǎng)景中通常端與端之間存在大量的交互,非對(duì)稱加密的效率是無法接受的。

          另外,在 HTTPS 的場(chǎng)景中只有服務(wù)端保存了私鑰,一對(duì)公私鑰只能實(shí)現(xiàn)單向的加解密,所以 HTTPS 中內(nèi)容傳輸加密采取的是對(duì)稱加密,而不是非對(duì)稱加密。

          為什么需要 CA 認(rèn)證機(jī)構(gòu)頒發(fā)證書?

          HTTP 協(xié)議被認(rèn)為不安全是因?yàn)閭鬏斶^程容易被監(jiān)聽者勾線監(jiān)聽、偽造服務(wù)器,而 HTTPS 協(xié)議主要解決的便是網(wǎng)絡(luò)傳輸?shù)陌踩詥栴}。

          首先我們假設(shè)不存在認(rèn)證機(jī)構(gòu),任何人都可以制作證書,這帶來的安全風(fēng)險(xiǎn)便是經(jīng)典的“中間人攻擊”問題。

          “中間人攻擊”的具體過程如下:

          過程原理如下:

          • 本地請(qǐng)求被劫持(如 DNS 劫持等),所有請(qǐng)求均發(fā)送到中間人的服務(wù)器。
          • 中間人服務(wù)器返回中間人自己的證書。
          • 客戶端創(chuàng)建隨機(jī)數(shù),通過中間人證書的公鑰對(duì)隨機(jī)數(shù)加密后傳送給中間人,然后憑隨機(jī)數(shù)構(gòu)造對(duì)稱加密對(duì)傳輸內(nèi)容進(jìn)行加密傳輸。
          • 中間人因?yàn)閾碛锌蛻舳说碾S機(jī)數(shù),可以通過對(duì)稱加密算法進(jìn)行內(nèi)容解密。
          • 中間人以客戶端的請(qǐng)求內(nèi)容再向正規(guī)網(wǎng)站發(fā)起請(qǐng)求。
          • 因?yàn)橹虚g人與服務(wù)器的通信過程是合法的,正規(guī)網(wǎng)站通過建立的安全通道返回加密后的數(shù)據(jù)。
          • 中間人憑借與正規(guī)網(wǎng)站建立的對(duì)稱加密算法對(duì)內(nèi)容進(jìn)行解密。
          • 中間人通過與客戶端建立的對(duì)稱加密算法對(duì)正規(guī)內(nèi)容返回的數(shù)據(jù)進(jìn)行加密傳輸。
          • 客戶端通過與中間人建立的對(duì)稱加密算法對(duì)返回結(jié)果數(shù)據(jù)進(jìn)行解密。

          由于缺少對(duì)證書的驗(yàn)證,所以客戶端雖然發(fā)起的是 HTTPS 請(qǐng)求,但客戶端完全不知道自己的網(wǎng)絡(luò)已被攔截,傳輸內(nèi)容被中間人全部竊取。

          瀏覽器是如何確保 CA 證書的合法性?

          證書包含什么信息?

          證書包含信息如下:

          • 頒發(fā)機(jī)構(gòu)信息
          • 公鑰
          • 公司信息
          • 域名
          • 有效期
          • 指紋
          • ......

          證書的合法性依據(jù)是什么?

          首先,權(quán)威機(jī)構(gòu)是要有認(rèn)證的,不是隨便一個(gè)機(jī)構(gòu)都有資格頒發(fā)證書,不然也不叫做權(quán)威機(jī)構(gòu)。

          另外,證書的可信性基于信任制,權(quán)威機(jī)構(gòu)需要對(duì)其頒發(fā)的證書進(jìn)行信用背書,只要是權(quán)威機(jī)構(gòu)生成的證書,我們就認(rèn)為是合法的。

          所以權(quán)威機(jī)構(gòu)會(huì)對(duì)申請(qǐng)者的信息進(jìn)行審核,不同等級(jí)的權(quán)威機(jī)構(gòu)對(duì)審核的要求也不一樣,于是證書也分為免費(fèi)的、便宜的和貴的。

          瀏覽器如何驗(yàn)證證書的合法性?

          瀏覽器發(fā)起 HTTPS 請(qǐng)求時(shí),服務(wù)器會(huì)返回網(wǎng)站的 SSL 證書。

          瀏覽器需要對(duì)證書做以下驗(yàn)證:

          • 驗(yàn)證域名、有效期等信息是否正確。證書上都有包含這些信息,比較容易完成驗(yàn)證。
          • 判斷證書來源是否合法。每份簽發(fā)證書都可以根據(jù)驗(yàn)證鏈查找到對(duì)應(yīng)的根證書,操作系統(tǒng)、瀏覽器會(huì)在本地存儲(chǔ)權(quán)威機(jī)構(gòu)的根證書,利用本地根證書可以對(duì)對(duì)應(yīng)機(jī)構(gòu)簽發(fā)證書完成來源驗(yàn)證。
          • **判斷證書是否被篡改。**需要與 CA 服務(wù)器進(jìn)行校驗(yàn)。

          • **判斷證書是否已吊銷。**通過 CRL(Certificate Revocation List 證書注銷列表)和 OCSP(Online Certificate Status Protocol 在線證書狀態(tài)協(xié)議)實(shí)現(xiàn)。

            其中 OCSP 可用于第 3 步中以減少與 CA 服務(wù)器的交互,提高驗(yàn)證效率。

          以上任意一步都滿足的情況下瀏覽器才認(rèn)為證書是合法的。

          **這里插一個(gè)我想了很久的但其實(shí)答案很簡單的問題:**既然證書是公開的,如果要發(fā)起中間人攻擊,我在官網(wǎng)上下載一份證書作為我的服務(wù)器證書,那客戶端肯定會(huì)認(rèn)同這個(gè)證書是合法的,如何避免這種證書冒用的情況?

          其實(shí)這就是非加密對(duì)稱中公私鑰的用處,雖然中間人可以得到證書,但私鑰是無法獲取的。

          一份公鑰是不可能推算出其對(duì)應(yīng)的私鑰,中間人即使拿到證書也無法偽裝成合法服務(wù)端,因?yàn)闊o法對(duì)客戶端傳入的加密數(shù)據(jù)進(jìn)行解密。

          只有認(rèn)證機(jī)構(gòu)可以生成證書嗎?

          如果需要瀏覽器不提示安全風(fēng)險(xiǎn),那只能使用認(rèn)證機(jī)構(gòu)簽發(fā)的證書。

          但瀏覽器通常只是提示安全風(fēng)險(xiǎn),并不限制網(wǎng)站不能訪問,所以從技術(shù)上誰都可以生成證書,只要有證書就可以完成網(wǎng)站的 HTTPS 傳輸。

          例如早期的 12306 采用的便是手動(dòng)安裝私有證書的形式實(shí)現(xiàn) HTTPS 訪問。

          本地隨機(jī)數(shù)被竊取怎么辦?

          證書驗(yàn)證是采用非對(duì)稱加密實(shí)現(xiàn),但是傳輸過程是采用對(duì)稱加密,而其中對(duì)稱加密算法中重要的隨機(jī)數(shù)是由本地生成并且存儲(chǔ)于本地的,HTTPS 如何保證隨機(jī)數(shù)不會(huì)被竊???

          其實(shí) HTTPS 并不包含對(duì)隨機(jī)數(shù)的安全保證,HTTPS 保證的只是傳輸過程安全,而隨機(jī)數(shù)存儲(chǔ)于本地,本地的安全屬于另一安全范疇,應(yīng)對(duì)的措施有安裝殺毒軟件、反木馬、瀏覽器升級(jí)修復(fù)漏洞等。

          用了 HTTPS 會(huì)被抓包嗎?

          HTTPS 的數(shù)據(jù)是加密的,常規(guī)下抓包工具代理請(qǐng)求后抓到的包內(nèi)容是加密狀態(tài),無法直接查看。

          但是,正如前文所說,瀏覽器只會(huì)提示安全風(fēng)險(xiǎn),如果用戶授權(quán)仍然可以繼續(xù)訪問網(wǎng)站,完成請(qǐng)求。

          因此,只要客戶端是我們自己的終端,我們授權(quán)的情況下,便可以組建中間人網(wǎng)絡(luò),而抓包工具便是作為中間人的代理。

          通常 HTTPS 抓包工具的使用方法是會(huì)生成一個(gè)證書,用戶需要手動(dòng)把證書安裝到客戶端中,然后終端發(fā)起的所有請(qǐng)求通過該證書完成與抓包工具的交互。

          然后抓包工具再轉(zhuǎn)發(fā)請(qǐng)求到服務(wù)器,最后把服務(wù)器返回的結(jié)果在控制臺(tái)輸出后再返回給終端,從而完成整個(gè)請(qǐng)求的閉環(huán)。

          既然 HTTPS 不能防抓包,那 HTTPS 有什么意義?HTTPS 可以防止用戶在不知情的情況下通信鏈路被監(jiān)聽,對(duì)于主動(dòng)授信的抓包操作是不提供防護(hù)的,因?yàn)檫@個(gè)場(chǎng)景用戶是已經(jīng)對(duì)風(fēng)險(xiǎn)知情。

          要防止被抓包,需要采用應(yīng)用級(jí)的安全防護(hù),例如采用私有的對(duì)稱加密,同時(shí)做好移動(dòng)端的防反編譯加固,防止本地算法被破解。

          總結(jié)

          以下用簡短的 Q&A 形式進(jìn)行全文總結(jié):

          Q:HTTPS 為什么安全?

          A:因?yàn)?HTTPS 保證了傳輸安全,防止傳輸過程被監(jiān)聽、防止數(shù)據(jù)被竊取,可以確認(rèn)網(wǎng)站的真實(shí)性。

          Q:HTTPS 的傳輸過程是怎樣的?

          A:客戶端發(fā)起 HTTPS 請(qǐng)求,服務(wù)端返回證書,客戶端對(duì)證書進(jìn)行驗(yàn)證,驗(yàn)證通過后本地生成用于改造對(duì)稱加密算法的隨機(jī)數(shù)。

          通過證書中的公鑰對(duì)隨機(jī)數(shù)進(jìn)行加密傳輸?shù)椒?wù)端,服務(wù)端接收后通過私鑰解密得到隨機(jī)數(shù),之后的數(shù)據(jù)交互通過對(duì)稱加密算法進(jìn)行加解密。

          Q:為什么需要證書?

          A:防止“中間人”攻擊,同時(shí)可以為網(wǎng)站提供身份證明。

          Q:使用 HTTPS 會(huì)被抓包嗎?

          A:會(huì)被抓包,HTTPS 只防止用戶在不知情的情況下通信被監(jiān)聽,如果用戶主動(dòng)授信,是可以構(gòu)建“中間人”網(wǎng)絡(luò),代理軟件可以對(duì)傳輸內(nèi)容進(jìn)行解密。

          順手分享一張學(xué)習(xí) HTTPS 的過程圖:

          1、Intellij IDEA這樣 配置注釋模板,讓你瞬間高出一個(gè)逼格!
          2、吊炸天的 Docker 圖形化工具 Portainer,必須推薦給你!
          3、最牛逼的 Java 日志框架,性能無敵,橫掃所有對(duì)手!
          4、把Redis當(dāng)作隊(duì)列來用,真的合適嗎?
          5、驚呆了,Spring Boot居然這么耗內(nèi)存!你知道嗎?
          6、全網(wǎng)最全 Java 日志框架適配方案!還有誰不會(huì)?
          7、Spring中毒太深,離開Spring我居然連最基本的接口都不會(huì)寫了

          點(diǎn)分享

          點(diǎn)收藏

          點(diǎn)點(diǎn)贊

          點(diǎn)在看

          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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免费在线视频 | 好逼天天| 激情婷婷久久 | 天天综合网天天色 |