證書固定

背景

互聯(lián)網(wǎng)上的安全通信是通過 TLS 完成的(人們經(jīng)常錯(cuò)誤地說成 “SSL” ,它是 TLS 的前身,由于安全漏洞而被棄用)。TLS中,就運(yùn)用到了前文所說的非對稱加密,所以也涉及公鑰的安全性問題,同樣是通過 CA 來解決的。

要使這一切正常工作,操作系統(tǒng)和可能的其他軟件提供商需要從證書頒發(fā)機(jī)構(gòu)獲得一小部分證書-這些證書是TLS中其他一切都依賴的“根級”證書。當(dāng)您通過TLS訪問網(wǎng)站時(shí),該網(wǎng)站提供的證書需要根據(jù)其中一個(gè)根級CA檢查其簽名以驗(yàn)證其有效性-這會(huì)斷言您正在訪問您認(rèn)為正在訪問的網(wǎng)站。

如前所述,TLS可以通過多種方式破壞,但最嚴(yán)重的是證書頒發(fā)機(jī)構(gòu)(CA)被破壞,因?yàn)樗绊懙矫總€(gè)人。這樣的安全事件已經(jīng)發(fā)生過,最突出的例子是DigiNotar。

必須強(qiáng)調(diào)的是,如果任何一個(gè)CA被攻破,那么所有的TLS都會(huì)被破壞。你為你的網(wǎng)站使用了什么CA并不重要,重要的是你的攻擊者使用了什么CA。

下圖演示的,就是當(dāng)有某個(gè) CA‘ 被攻破后,攔截方通過修改發(fā)送方數(shù)據(jù)來欺騙接收方的流程。

lanjie.png

因?yàn)?CA' 也是被信任的 CA。上述修改后的數(shù)據(jù) d' 可以被正常的校驗(yàn)簽名,也就成功的欺騙了接收方,被接收方信任。

操作系統(tǒng)供應(yīng)商/移動(dòng)設(shè)備制造商對確保安全有著濃厚的興趣:人們信任他們的產(chǎn)品對他們的業(yè)務(wù)成功非常重要。因此,當(dāng)CA不再受信任時(shí),他們通常會(huì)向客戶推送安全更新。例如,當(dāng)DigiNotar受到攻擊時(shí),蘋果發(fā)布了更新。瀏覽器制造商也進(jìn)行了類似的更新,正如這里所描述的那樣。

因此,這給了我們一些保證,即使沒有證書固定,我們?nèi)匀豢梢該碛辛己玫陌踩?。然而,有一些隱患:用戶并不總是及時(shí)安裝他們的安全更新,這其中就存在利用漏洞的時(shí)差。

證書固定的用途

證書固定是一種用于移動(dòng)應(yīng)用程序的技術(shù),用于添加額外的保護(hù)層來保護(hù)通信安全。

證書固定的概念是使移動(dòng)應(yīng)用程序只信任與其通信的網(wǎng)站上使用的確切證書,從而不再依賴CA的安全性。實(shí)現(xiàn)這一點(diǎn)的一種方法(稍后將提到其他更實(shí)用的方法)是在開發(fā)期間在移動(dòng)應(yīng)用程序源文件中提供確切的證書(或其加密散列),并編寫代碼來驗(yàn)證此證書與網(wǎng)站在TLS通信的初始階段發(fā)送的內(nèi)容是否匹配。如果不存在完全匹配,則拒絕通信并不繼續(xù)。

有些人使用證書釘住還有第二個(gè)原因,那就是防止人們通過攔截代理對你的移動(dòng)應(yīng)用進(jìn)行反向工程。沒有證書固定,任何人都可以使用眾所周知的技術(shù)查看他們的移動(dòng)應(yīng)用程序和服務(wù)器之間的通信(例如charles)。這并不是破壞TLS-其他人無法檢查您的通信,只有您可以通過在您的移動(dòng)設(shè)備上安裝攔截代理證書來檢查您自己的通信。通過添加操作系統(tǒng)信任且您知道私鑰而其他人都不知道的新證書,您就可以窺探TLS通信,但其他人都不能。如果由于應(yīng)用程序停止攔截而固定了證書,則這不會(huì)直接起作用-它不信任新安裝的證書,而是只信任固定的確切證書。

證書固定的缺點(diǎn)

證書固定的一個(gè)關(guān)鍵缺點(diǎn)是,更改證書意味著您需要發(fā)布新版本的應(yīng)用程序,并強(qiáng)制將用戶升級到最新版本。這是因?yàn)閼?yīng)用程序只使用固定的確切證書-如果使用任何其他證書,通信中斷。如果您使用的是短期證書,那么這需要頻繁的維護(hù)。

為了解決這個(gè)問題了,我們可以只固定公鑰(與完整證書相反,即不固定CA信息及哈希加密串),那么只要在新證書中使用相同的公鑰,就可以在不發(fā)布新應(yīng)用程序的情況下輪換證書(替換其他CA)。也就是說,您在證書過期時(shí)更改證書,但使用與以前相同的加密密鑰。這會(huì)帶來更友好的用戶體驗(yàn),但它要求管理證書的人員(通常是操作團(tuán)隊(duì))遵循開發(fā)團(tuán)隊(duì)的要求。當(dāng)然,如果有任何關(guān)鍵的變化,需要發(fā)布新的應(yīng)用程序,并且需要進(jìn)行強(qiáng)制升級。

這個(gè)操作對應(yīng)了 Android manifest 網(wǎng)絡(luò)安全配置中的 <pin> 標(biāo)簽配置

其他方案

為了消除在發(fā)布新證書時(shí)升級應(yīng)用程序的需要,但仍然希望獲得比TLS更好的安全性。除了使用證書固定,我們還有另一種方案。

開發(fā)人員固定證書頒發(fā)機(jī)構(gòu)(CA)的公鑰。換句話說,除了安全所需的所有常規(guī)證書檢查之外,應(yīng)用程序現(xiàn)在將只接受由您允許的特定CA(或多個(gè)CA)簽名的證書,而不接受其他CA簽名的證書。

回想一下我們上面問題的討論:如果任何一個(gè)CA被攻破,都會(huì)導(dǎo)致我們變得易受攻擊。但是,通過固定我們信任的一個(gè)或多個(gè)CA的證書,我們就不再有這種風(fēng)險(xiǎn)。取而代之的是,我們信任的確切CA需要受到損害,才能使我們變得脆弱。

這不像完全證書鎖定那樣強(qiáng)大,因?yàn)槿绻湃捂溨械闹虚g密鑰受損,那么您仍然容易受到攻擊。但是,它比僅使用TLS要好,因?yàn)楝F(xiàn)在您不依賴于所有CA都是安全的:相反,您只依賴您正在使用的一個(gè)或多個(gè)CA是安全的。

使用此方法時(shí),僅當(dāng)您更改CA或CA更改其公鑰時(shí),才需要更新應(yīng)用程序。如果您的公司有限制CA的策略,那么您可以鎖定這些CA的公鑰,并且很可能在很長很長一段時(shí)間內(nèi)都不需要擔(dān)心更新應(yīng)用程序或強(qiáng)制升級。這對那些使用短期證書的人特別有吸引力。

這個(gè)操作對應(yīng)了 Android manifest 網(wǎng)絡(luò)安全配置中的 <certificates> 標(biāo)簽配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容