HTTPS流量解密方法之Man-in-the-middle

Man-in-the-middle(中間人,簡稱為 MITM),能夠與網(wǎng)絡(luò)通訊兩端分別創(chuàng)建連接,交換其收到的數(shù)據(jù),使得通訊兩端都認(rèn)為自己直接與對方對話,事實上整個會話都被中間人所控制。簡而言之,在真正的服務(wù)端看來,中間人是客戶端;而真正的客戶端會認(rèn)為中間人是服務(wù)端。
實現(xiàn)中間人攻擊有各種各樣的手段,這里不展開討論。一些常見的 HTTP/HTTPS 抓包調(diào)試工具,都是通過創(chuàng)建本地 Proxy 服務(wù),再修改瀏覽器 Proxy 設(shè)置來達(dá)到攔截流量的目的,他們的工作原理與中間人攻擊一致。我用過的這一類工具有:Fiddler、Charles 和 whistle。我在「HTTP 代理原理及實現(xiàn)(一)」一文中介紹的 HTTP 普通代理,扮演的就是 HTTP 中間人角色。
本文主要討論 HTTPS 中間人,簡單示意如下:

HTTPS流量解密方法之Man-in-the-middle
上述 HTTPS(1) 連接,是中間人冒充客戶端,與服務(wù)端建立的連接,由于 HTTPS 服務(wù)端一般不認(rèn)證客戶端身份,這一步通常沒有問題。而對于 HTTPS(2) 連接來說,中間人想要冒充服務(wù)端,必須擁有對應(yīng)域名的證書私鑰,而攻擊者要拿到私鑰,只能通過這些手段:

1. 去網(wǎng)站服務(wù)器上拿;
2. 從 CA 處簽發(fā)證書;
3. 自己簽發(fā)證書。

要防范前兩點,需要網(wǎng)站做好各個方面的安全防護(hù),從主機(jī)安全到網(wǎng)站安全(避免私鑰被盜),從域名解析安全到域名郵箱安全(避免攻擊者重簽證書)。而攻擊者自己簽發(fā)的證書,無法通過系統(tǒng)內(nèi)置根證書的驗證,默認(rèn)無法用于中間人攻擊。
對于 Fiddler 這一類調(diào)試工具來說,能夠解密 HTTPS 流量的關(guān)鍵在于他們會往系統(tǒng)受信任的根證書列表導(dǎo)入自己的證書,這樣他們的自簽證書就能被瀏覽器信任。進(jìn)入 Fiddler 設(shè)置中的「HTTPS」Tab,勾選相關(guān)功能后,就可以順利解密和修改 HTTPS 流量。