Https 真的安全嗎?可以抓包嗎?如何防止抓包嗎?
鏈接:https://www.jianshu.com/p/54ae53f17602
背景
我們知道,http 通信存在以下問(wèn)題:
通信使用明文可能會(huì)被竊聽(tīng)
不驗(yàn)證通信方的身份可能遭遇偽裝
無(wú)法證明報(bào)文的完整型,可能已遭篡改
使用 https 可以解決數(shù)據(jù)安全問(wèn)題,但是你真的理解 https 嗎?
當(dāng)面試官連續(xù)對(duì)你發(fā)出靈魂追問(wèn)的時(shí)候,你能對(duì)答如流嗎
什么是 https,為什么需要 https
https 的連接過(guò)程
https 的加密方式是怎樣的,對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密,為什么要這樣設(shè)計(jì)??jī)?nèi)容傳輸為什么要使用對(duì)稱(chēng)機(jī)密
https 是絕對(duì)安全的嗎
https 可以抓包嗎
什么是 https
簡(jiǎn)單來(lái)說(shuō), https 是 http + ssl,對(duì) http 通信內(nèi)容進(jìn)行加密,是HTTP的安全版,是使用TLS/SSL加密的HTTP協(xié)議
Https的作用:
內(nèi)容加密 建立一個(gè)信息安全通道,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩?/span>
身份認(rèn)證 確認(rèn)網(wǎng)站的真實(shí)性
數(shù)據(jù)完整性 防止內(nèi)容被第三方冒充或者篡改
什么是SSL
SSL 由 Netscape 公司于1994年創(chuàng)建,它旨在通過(guò)Web創(chuàng)建安全的Internet通信。它是一種標(biāo)準(zhǔn)協(xié)議,用于加密瀏覽器和服務(wù)器之間的通信。它允許通過(guò)Internet安全輕松地傳輸賬號(hào)密碼、銀行卡、手機(jī)號(hào)等私密信息。
SSL證書(shū)就是遵守SSL協(xié)議,由受信任的CA機(jī)構(gòu)頒發(fā)的數(shù)字證書(shū)。
SSL/TLS的工作原理:
需要理解SSL/TLS的工作原理,我們需要掌握加密算法。加密算法有兩種:對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密:
對(duì)稱(chēng)加密:通信雙方使用相同的密鑰進(jìn)行加密。特點(diǎn)是加密速度快,但是缺點(diǎn)是需要保護(hù)好密鑰,如果密鑰泄露的話(huà),那么加密就會(huì)被別人pojie。常見(jiàn)的對(duì)稱(chēng)加密有AES,DES算法。
非對(duì)稱(chēng)加密:它需要生成兩個(gè)密鑰:公鑰(Public Key)和私鑰(Private Key)。
公鑰顧名思義是公開(kāi)的,任何人都可以獲得,而私鑰是私人保管的。相信大多程序員已經(jīng)對(duì)這種算法很熟悉了:我們提交代碼到github的時(shí)候,就可以使用SSH key:在本地生成私鑰和公鑰,私鑰放在本地.ssh目錄中,公鑰放在github網(wǎng)站上,這樣每次提交代碼,不用麻煩的輸入用戶(hù)名和密碼了,github會(huì)根據(jù)網(wǎng)站上存儲(chǔ)的公鑰來(lái)識(shí)別我們的身份。
https 的連接過(guò)程

https 的連接過(guò)程大概分為兩個(gè)階段,證書(shū)驗(yàn)證階段和數(shù)據(jù)傳輸階段
證書(shū)驗(yàn)證階段
大概分為三個(gè)步驟
瀏覽器發(fā)起請(qǐng)求
服務(wù)器接收到請(qǐng)求之后,會(huì)返回證書(shū),包括公鑰
瀏覽器接收到證書(shū)之后,會(huì)檢驗(yàn)證書(shū)是否合法,不合法的話(huà),會(huì)彈出告警提示(怎樣驗(yàn)證合法,下文會(huì)詳細(xì)解析,這里先忽略)
數(shù)據(jù)傳輸階段
證書(shū)驗(yàn)證合法之后
瀏覽器會(huì)生成一個(gè)隨機(jī)數(shù),
使用公鑰進(jìn)行加密,發(fā)送給服務(wù)端
服務(wù)器收到瀏覽器發(fā)來(lái)的值,使用私鑰進(jìn)行解密
解析成功之后,使用對(duì)稱(chēng)加密算法進(jìn)行加密,傳輸給客戶(hù)端
https 的加密方式是怎樣的,對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密,為什么要這樣設(shè)計(jì)
從上面我們可以知道,https 加密是采用對(duì)稱(chēng)加密和非對(duì)稱(chēng)機(jī)密一起結(jié)合的。
在證書(shū)驗(yàn)證階段,使用非對(duì)稱(chēng)加密。
在數(shù)據(jù)傳輸階段,使用對(duì)稱(chēng)機(jī)密。
這樣設(shè)計(jì)有一個(gè)好處,能最大程度得兼顧安全效率。
在證書(shū)驗(yàn)證階段,使用非對(duì)稱(chēng)加密,需要公鑰和私鑰,假如瀏覽器的公鑰泄漏了,我們還是能夠確保隨機(jī)數(shù)的安全,因?yàn)榧用艿臄?shù)據(jù)只有用私鑰才能解密。這樣能最大程度確保隨機(jī)數(shù)的安全。
在內(nèi)容傳輸階段,使用對(duì)稱(chēng)機(jī)密,可以大大提高加解密的效率。
內(nèi)容傳輸為什么要使用對(duì)稱(chēng)機(jī)密
對(duì)稱(chēng)加密效率比較高
一對(duì)公私鑰只能實(shí)現(xiàn)單向的加解密。只有服務(wù)端保存了私鑰。如果使用非對(duì)稱(chēng)機(jī)密,相當(dāng)于客戶(hù)端必須有自己的私鑰,這樣設(shè)計(jì)的話(huà),每個(gè)客戶(hù)端都有自己的私鑰,這很明顯是不合理的,因?yàn)樗借€是需要申請(qǐng)的。
https 是絕對(duì)安全的嗎
不是絕對(duì)安全的,可以通過(guò)中間人攻擊。
什么是中間人攻擊
中間人攻擊是指攻擊者與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過(guò)一個(gè)私密的連接與對(duì)方直接對(duì)話(huà),但事實(shí)上整個(gè)會(huì)話(huà)都被攻擊者完全控制。
HTTPS 使用了 SSL 加密協(xié)議,是一種非常安全的機(jī)制,目前并沒(méi)有方法直接對(duì)這個(gè)協(xié)議進(jìn)行攻擊,一般都是在建立 SSL 連接時(shí),攔截客戶(hù)端的請(qǐng)求,利用中間人獲取到 CA證書(shū)、非對(duì)稱(chēng)加密的公鑰、對(duì)稱(chēng)加密的密鑰;有了這些條件,就可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行攔截和篡改。

本地請(qǐng)求被劫持(如DNS劫持等),所有請(qǐng)求均發(fā)送到中間人的服務(wù)器
中間人服務(wù)器返回中間人自己的證書(shū)
客戶(hù)端創(chuàng)建隨機(jī)數(shù),通過(guò)中間人證書(shū)的公鑰對(duì)隨機(jī)數(shù)加密后傳送給中間人,然后憑隨機(jī)數(shù)構(gòu)造對(duì)稱(chēng)加密對(duì)傳輸內(nèi)容進(jìn)行加密傳輸
中間人因?yàn)閾碛锌蛻?hù)端的隨機(jī)數(shù),可以通過(guò)對(duì)稱(chēng)加密算法進(jìn)行內(nèi)容解密
中間人以客戶(hù)端的請(qǐng)求內(nèi)容再向官方網(wǎng)站發(fā)起請(qǐng)求
因?yàn)橹虚g人與服務(wù)器的通信過(guò)程是合法的,官方網(wǎng)站通過(guò)建立的安全通道返回加密后的數(shù)據(jù)
中間人憑借與官方網(wǎng)站建立的對(duì)稱(chēng)加密算法對(duì)內(nèi)容進(jìn)行解密
中間人通過(guò)與客戶(hù)端建立的對(duì)稱(chēng)加密算法對(duì)官方內(nèi)容返回的數(shù)據(jù)進(jìn)行加密傳輸
客戶(hù)端通過(guò)與中間人建立的對(duì)稱(chēng)加密算法對(duì)返回結(jié)果數(shù)據(jù)進(jìn)行解密
由于缺少對(duì)證書(shū)的驗(yàn)證,所以客戶(hù)端雖然發(fā)起的是 HTTPS 請(qǐng)求,但客戶(hù)端完全不知道自己的網(wǎng)絡(luò)已被攔截,傳輸內(nèi)容被中間人全部竊取。
https 是如何防止中間人攻擊的
https 無(wú)法防止中間人攻擊,只有做證書(shū)固定ssl-pinning 或者 apk中預(yù)置證書(shū)做自簽名驗(yàn)證可以防中間人攻擊
瀏覽器是如何確保CA證書(shū)的合法性?
一、證書(shū)包含什么信息?
頒發(fā)機(jī)構(gòu)信息、公鑰、公司信息、域名、有效期、指紋……
二、證書(shū)的合法性依據(jù)是什么?
首先,權(quán)威機(jī)構(gòu)是要有認(rèn)證的,不是隨便一個(gè)機(jī)構(gòu)都有資格頒發(fā)證書(shū),不然也不叫做權(quán)威機(jī)構(gòu)。另外,證書(shū)的可信性基于信任制,權(quán)威機(jī)構(gòu)需要對(duì)其頒發(fā)的證書(shū)進(jìn)行信用背書(shū),只要是權(quán)威機(jī)構(gòu)生成的證書(shū),我們就認(rèn)為是合法的。所以權(quán)威機(jī)構(gòu)會(huì)對(duì)申請(qǐng)者的信息進(jìn)行審核,不同等級(jí)的權(quán)威機(jī)構(gòu)對(duì)審核的要求也不一樣,于是證書(shū)也分為免費(fèi)的、便宜的和貴的。
三、瀏覽器如何驗(yàn)證證書(shū)的合法性?
瀏覽器發(fā)起HTTPS請(qǐng)求時(shí),服務(wù)器會(huì)返回網(wǎng)站的SSL證書(shū),瀏覽器需要對(duì)證書(shū)做以下驗(yàn)證:
驗(yàn)證域名、有效期等信息是否正確。證書(shū)上都有包含這些信息,比較容易完成驗(yàn)證;
判斷證書(shū)來(lái)源是否合法。每份簽發(fā)證書(shū)都可以根據(jù)驗(yàn)證鏈查找到對(duì)應(yīng)的根證書(shū),操作系統(tǒng)、瀏覽器會(huì)在本地存儲(chǔ)權(quán)威機(jī)構(gòu)的根證書(shū),利用本地根證書(shū)可以對(duì)對(duì)應(yīng)機(jī)構(gòu)簽發(fā)證書(shū)完成來(lái)源驗(yàn)證;
判斷證書(shū)是否被篡改。需要與CA服務(wù)器進(jìn)行校驗(yàn);
判斷證書(shū)是否已吊銷(xiāo)。通過(guò)CRL(Certificate Revocation List 證書(shū)注銷(xiāo)列表)和 OCSP(Online Certificate Status Protocol 在線(xiàn)證書(shū)狀態(tài)協(xié)議)實(shí)現(xiàn),其中 OCSP 可用于第3步中以減少與CA服務(wù)器的交互,提高驗(yàn)證效率。
以上任意一步都滿(mǎn)足的情況下瀏覽器才認(rèn)為證書(shū)是合法的。
https 可以抓包嗎
HTTPS 的數(shù)據(jù)是加密的,常規(guī)下抓包工具代理請(qǐng)求后抓到的包內(nèi)容是加密狀態(tài),無(wú)法直接查看。
但是,我們可以通過(guò)抓包工具來(lái)抓包。它的原理其實(shí)是模擬一個(gè)中間人。
通常 HTTPS 抓包工具的使用方法是會(huì)生成一個(gè)證書(shū),用戶(hù)需要手動(dòng)把證書(shū)安裝到客戶(hù)端中,然后終端發(fā)起的所有請(qǐng)求通過(guò)該證書(shū)完成與抓包工具的交互,然后抓包工具再轉(zhuǎn)發(fā)請(qǐng)求到服務(wù)器,最后把服務(wù)器返回的結(jié)果在控制臺(tái)輸出后再返回給終端,從而完成整個(gè)請(qǐng)求的閉環(huán)。
有人可能會(huì)問(wèn)了,既然 HTTPS 不能防抓包,那 HTTPS 有什么意義?
擴(kuò)展
如何防止抓包?
對(duì)于HTTPS API接口,如何防止抓包呢?既然問(wèn)題出在證書(shū)信任問(wèn)題上,那么解決方法就是在我們的APP中預(yù)置證書(shū)。在TLS/SSL握手時(shí),用預(yù)置在本地的證書(shū)中的公鑰校驗(yàn)服務(wù)器的數(shù)字簽名,只有簽名通過(guò)才能成功握手。由于數(shù)字簽名是使用私鑰生成的,而私鑰只掌握在我們手上,中間人無(wú)法偽造一個(gè)有效的簽名,因此攻擊失敗,無(wú)法抓包。
同時(shí),為了防止預(yù)置證書(shū)被替換,在證書(shū)存儲(chǔ)上,可以將證書(shū)進(jìn)行加密后進(jìn)行「嵌入存儲(chǔ)」,如嵌入在圖片中或一段語(yǔ)音中。這涉及到信息隱寫(xiě)的領(lǐng)域,這個(gè)話(huà)題我們有空了詳細(xì)說(shuō)。
預(yù)置證書(shū)/公鑰更新問(wèn)題
這樣做雖然解決了抓包問(wèn)題,但是也帶來(lái)了另外一個(gè)問(wèn)題:我們購(gòu)買(mǎi)的證書(shū)都是有有效期的,到期前需要對(duì)證書(shū)進(jìn)行更新。主要有兩種方式:
在APP中只預(yù)埋公鑰,這樣只要私鑰不變,即使證書(shū)更新也不用更新該公鑰。但是,這樣不太符合周期性更新私鑰的安全審計(jì)需求。一個(gè)折中的方法是,一次性預(yù)置多個(gè)公鑰,只要任意一個(gè)公鑰驗(yàn)證通過(guò)即可。考慮到我們的證書(shū)一般購(gòu)買(mǎi)周期是3-5年,那么3個(gè)公鑰,可以使用9-15年,同時(shí),我們?cè)诖似陂g還可以發(fā)布新版本廢棄老公鑰,添加新公鑰,這樣可以使公鑰一直更新下去。
小結(jié)
開(kāi)頭說(shuō)到的幾個(gè)問(wèn)題,你能對(duì)答如流了嗎
什么是 https,為什么需要 https
https 的連接過(guò)程
https 的加密方式是怎樣的,對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密,為什么要這樣設(shè)計(jì)??jī)?nèi)容傳輸為什么要使用對(duì)稱(chēng)機(jī)密
https 是絕對(duì)安全的嗎
https 可以抓包嗎
1、2019 年 9 月全國(guó)程序員工資統(tǒng)計(jì),你是什么水平?
3、從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5、37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...
6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光
