網絡面經:使用HTTPS就絕對安全了嗎?
本文轉載自微信公眾號「程序新視界」,作者二師兄 。轉載本文請聯系程序新視界公眾號。
朋友面試阿里,關于HTTPS被問了三道題,看看你能回到上幾道題。
第一,為什么使用HTTPS之后,通信就安全了?
第二,HTTPS實現通信安全的原理是什么?
第三,使用了HTTPS就絕對安全了嗎?
本篇文章就帶大家一起聊聊HTTPS,順便解答上面三個問題。
關于HTTPS
前面學習過HTTP協議的報文格式及交互模式,我們知道HTTP傳輸的內容本質上就是文本,HTTP/2采用了二進制字節的形式傳輸,但依舊可以進行反編譯。也就是說,在通信的過程中只要攔截對應的請求,就可以獲得通信的報文信息。從這個層面來講,我們說HTTP協議是不安全的。
而HTTPS是身披SSL外殼的HTTP,利用SSL/TLS建立全信道,加密數據包。HTTPS的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性。
在HTTPS通信過程中,會涉及到非對稱加密和對稱加密兩種算法,從而滿足了性能和安全的雙重需要。
HTTPS的特點
HTTPS傳輸的是加密之后的數據,即使被攔截也很難獲得明文。HTTPS有以下特點:
- 內容加密:采用混合加密技術(結合對稱加密和非對稱加密技術),中間者無法直接查看明文內容;
- 驗證身份:通過證書認證客戶端訪問的是自己的服務器;
- 保護數據完整性:防止傳輸的內容被中間人冒充或者篡改;
關于這些特點,我們可以在原理層面進行逐步分析。
HTTPS協議實現原理
采用HTTPS通信的過程涉及到兩部分:證書驗證和數據傳輸。
HTTPS原理
第一階段,證書獲取及驗證過程:
- 瀏覽器發起一個HTTPS的請求;
- 服務器接收到請求,返回一個HTTPS證書,該證書內包含服務器私鑰對應的公鑰信息;
- 瀏覽器驗證證書是否合法,如果不合法(未經過CA認證或未添加信任)則進行提示。通常位于瀏覽器中URL地址左側有的小鎖圖標處;
第二階段,加密秘鑰傳輸及加密報文傳輸,可以統稱數據傳輸:
- 證書驗證合法或可信任,則在瀏覽器端生成一個隨機數,該隨機數用于通信報文的對稱加密;
- 通過公鑰將隨機數加密,傳輸給服務器;
- 服務器獲得加密的隨機數,使用私鑰進行解密,并存儲隨機數。此時,雙方都有了對稱加密的秘鑰(隨機數);
- 服務器使用隨機數對要傳輸的數據進行對稱加密,并將加密信息返回給客戶端;
- 客戶端獲得加密數據,使用隨機數作為秘鑰,基于對稱加密算法對報文進行解密,渲染呈現給用戶;
關于HTTPS的實現原理總結一下就三步:
- 客戶端向服務器端索要并驗證公鑰;
- 雙方協商生成"對話密鑰";
- 雙方采用"對話密鑰"進行加密通信;
其中前兩步又稱作"握手階段"(handshake)。
上述流程看似簡單,但會延伸出來幾個問題,我們來逐個看看。
如何保證公鑰不被篡改?
解決方法:將公鑰放在數字證書中。只要證書是可信的,公鑰就是可信的。這也是為什么服務器返回的是證書,而不是單純的公鑰。
如何減少公鑰加密耗時問題?
解決方法:每一次對話(session),客戶端和服務器端都生成一個"對話密鑰"(session key),用它來加密信息。由于"對話密鑰"是對稱加密,所以運算速度非常快,而服務器公鑰只用于加密"對話密鑰"本身,這樣就減少了加密運算的消耗時間。
這也是為什么在HTTPS通信過程中會生成一個隨機數的原因,它就是“對話密鑰”,用來數據通信的對稱加密,提升算法性能。
另外,一對公私鑰只能實現單向的加解密,所以HTTPS中內容傳輸加密采取的是對稱加密,而不是非對稱加密。
分析完整個HTTPS交互的流程,看似已經完美的方案中其實還有一個漏洞:數據在網絡傳輸中如果被“中間人”掉包了怎么辦?
“中間人”攻擊
我們先來看一下,在基于HTTPS交互的過程中,在通信的過程中公鑰被掉包了會發生什么情況。
中間人攻擊
在上圖中,基本原理就是中間人通過網絡劫持等,將通信過程中的公鑰替換成自己的,然后假裝自己是服務器與客戶端進行通信。從而對信息進行竊取或篡改。
我們知道,公私鑰及證書都是可以自己進行生成的,雖然發起了HTTPS的請求,但如果證書和公私鑰無法保證是否被替換,傳輸的安全性就無法保證。此時,就需要拿出終極武器:SSL證書申購。也稱作CA證書申購。
CA證書
CA是證書的簽發機構,它是公鑰基礎設施(Public Key Infrastructure,PKI)的核心。CA是負責簽發證書、認證證書、管理已頒發證書的機關。有這樣一個權威機構來簽發證書,就確保了證書的可信性(合法性)。
瀏覽器會對服務器返回SSL證書進行驗證:
- 驗證域名、有效期等信息是否正確;
- 判斷證書來源是否合法:每份簽發證書都可以根據驗證鏈查找到對應的根證書,操作系統、瀏覽器會在本地存儲權威機構的根證書,利用本地根證書可以對對應機構簽發證書完成來源驗證;
- 判斷證書是否被篡改:需要與CA服務器進行校驗;
- 判斷證書是否已吊銷,可用于第3步中,以減少與CA服務器的交互,提高驗證效率。
上述條件完全滿足時,才說明該證書合法。
此時,再回到“中間人”攻擊的問題,會發現,當瀏覽器獲取到假公鑰時,通過比對驗證就會發現不合法,進而在瀏覽器層面對用戶進行風險提示。但瀏覽器只會進行風險提示,用戶仍然可以授權信任證書繼續操作。
使用了HTTPS就絕對安全了嗎?
通過上面的學習我們已經知道HTTPS通信是加密的,常規抓包手段是無法獲取報文內容的。但像上面所說的“中間人”攻擊的情況,不顧瀏覽器的安全提醒,繼續進行后續網頁的訪問,則會出現安全問題。
在客戶端授權的情況下,可以組建中間人網絡,而抓包工具便是作為中間人的代理。通常,HTTPS抓包工具會生成一個證書(類比的假證書),用戶安裝在客戶端或添加信任。此時,客戶端先與抓包工具通信,抓包工具再將請求轉發到服務器,服務器返回的信息,抓包工具可進行處理或輸出,然后再返回給客戶端。
因此,HTTPS的安全性更多的體現在用戶不知情的情況下進行的訪問,如果用戶已知情或主動授信,表明用戶已經明確了風險,此時如果出現中間人攻擊的問題,HTTPS還是不安全的。
本地隨機數的安全
最后,還有一方面的安全需要我們留意,那就是本地隨機數的安全。在HTTPS內容傳輸時采用的是對稱加密,因此秘鑰在客戶端和服務器端均存儲的有。針對本地存儲是隨機數,HTTPS并不能保證它的安全,HTTPS重點關注的是傳輸過程中的安全。
也就是說,本地的安全屬于另一安全范疇,應對的措施有安裝殺毒軟件、反木馬、瀏覽器升級修復漏洞等。
小結
最后,再來看看那三個問題:
第一,為什么使用HTTPS之后,通信就安全了?
HTTPS利用SSL/TLS建立全信道,加密數據包,保證了傳輸安全,防止傳輸過程被監聽、防止數據被竊取,可以確認網站的真實性。
第二,HTTPS實現通信安全的原理是什么?
HTTPS實現安全通信主要通過多種加密方式和身份驗證實現,主要分三步:(1)客戶端向服務器端索要證書并驗證公鑰;(2)雙方協商生成"對話密鑰";(3)雙方采用"對話密鑰"進行加密通信;
其中,證書保證了公鑰的可信與安全,公鑰保證了“對話秘鑰”傳輸的安全,“對話秘鑰”保證了通信報文的安全。
第三,使用了HTTPS就絕對安全了嗎?
HTTPS重點關注傳輸過程中的安全,在用戶不知情的情況下進行網站訪問,瀏覽器會給出安全提示。但如果用戶繼續訪問或設置授信,則會發生“中間人”攻擊的可能性。在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。中間人攻擊常發生在公共WIF或路由上。
在本地隨機數(秘鑰)安全方面,HTTPS也無能為力,只能借助殺毒軟件、漏洞升級等來防護。同時,在黑客攻擊、拒絕服務攻擊、服務器劫持等方面,HTTPS幾乎起不到作用。