HTTPS 證書被偽造了怎么辦?
HTTPS 協(xié)議的安全依賴于它的證書機(jī)制,如果攻擊者申請到了一張和你的網(wǎng)站一摸一樣的證書,那你網(wǎng)站的安全機(jī)制也就不復(fù)存在了。本文來聊一聊,如何預(yù)防 HTTPS 證書偽造。
證書劫持
如果想部署 HTTPS 網(wǎng)站,首先向 CA 機(jī)構(gòu)申請一張證書, CA 機(jī)構(gòu)在審核申請者的身份后,會簽發(fā)一張證書,證書中包含了申請者網(wǎng)站的主機(jī)名、主機(jī)公鑰,同時 CA 機(jī)構(gòu)會用自己的私鑰對整個證書進(jìn)行簽名,并將簽名添加到證書文件中,然后發(fā)送給證書申請者。證書是 TLS 協(xié)議中非常關(guān)鍵的一環(huán),其主要作用:
- 向網(wǎng)站訪問者確認(rèn)服務(wù)器的真實(shí)身份,確??蛻舳?瀏覽器)是和真正的網(wǎng)站提供者在通信,避免遇到中間人攻擊,實(shí)現(xiàn)密碼學(xué)中的身份認(rèn)證特性。
- 客戶端和服務(wù)器使用證書中的公鑰(依賴于不同的密碼協(xié)商算法,功能有所不同)協(xié)商出主密鑰(Master Secret),有了主密鑰,客戶端和服務(wù)器端就可以保證通信數(shù)據(jù)是加密且沒有被篡改。
HTTPS 證書最大的問題就是偽造證書的存在,一旦出現(xiàn)偽造證書,安全體系將會非常脆弱,出現(xiàn)偽造證書的原因如下:
- CA 機(jī)構(gòu)有意無意會簽發(fā)一些錯誤的證書,比如 CA 機(jī)構(gòu)沒有正確校驗申請者的身份。
- CA 機(jī)構(gòu)是一個追求盈利的機(jī)構(gòu),在利益的驅(qū)動下,可能會無節(jié)制的簽發(fā)證書,如果簽發(fā)一個惡意的二級 CA 證書,帶來的危害更大。
- 攻擊者會通過各種技術(shù)攻擊手段,冒充或者偽造某個域名的擁有者,從而成功申請到一張證書,然后通過證書進(jìn)行危害操作。
這時,證書的使用者可能會存在下面的困惑:
- 域名擁有者無法知曉那些 CA 機(jī)構(gòu)給他簽發(fā)了證書,也不知道是否有人冒充他的身份申請證書并提供服務(wù)。
- CA 機(jī)構(gòu)并不清楚它到底簽發(fā)了多少證書,也不確定是否簽發(fā)了偽造證書,二級 CA 簽發(fā)機(jī)制不可控。
- 對于瀏覽器來說,它沒有技術(shù)手段校驗證書是否是合法的。
證書透明度
為了解決證書潛在的問題,谷歌提出了一個解決方案,這就是證書透明度(CT)。CT 是一組技術(shù)解決方案,它能夠?qū)徲?、監(jiān)控證書的簽發(fā)、使用,從而讓更透明,它不是證書的替代解決方案,而是證書的有效補(bǔ)充。通過 CT,能夠達(dá)成以下的幾個目標(biāo):
- CA 機(jī)構(gòu)能夠知曉其簽發(fā)了那些證書,并快速檢測到是否簽發(fā)惡意證書了。
- 網(wǎng)站擁有者能夠知曉域名對應(yīng)證書簽發(fā)的全過程,一旦發(fā)現(xiàn)有攻擊者偽造了域名對應(yīng)的證書,可以快速聯(lián)系 CA 機(jī)構(gòu),吊銷該證書。
- 瀏覽器廠商能夠?qū)徲嬜C書的使用情況,如果發(fā)現(xiàn)有惡意證書,可以快速關(guān)閉HTTPS連接,保障用戶的安全。
CT 日志服務(wù)所使用的技術(shù)和區(qū)塊鏈技術(shù)非常類似,通過密碼學(xué)手段(Merkle hash tree)保證了其數(shù)據(jù)只能增長,但修改、插入、刪除都會被發(fā)現(xiàn)。由于審計單條數(shù)據(jù)的成本并不高,審計員可以是一個單獨(dú)的服務(wù),也可以是觀察者的一項功能,甚至可以作為客戶端的一部分。
Expect-CT
為了確保瀏覽器能在訪問到缺少 CT 監(jiān)督的證書(例如 CA 意外發(fā)出的證書)時采取措施,Google 提案增加了一個新的 Expect-CT HTTP Header,該 HTTP Header 用來告訴瀏覽器期望證使用書透明度服務(wù)。Expect-CT CT 頭部允許站點(diǎn)選擇報告或強(qiáng)制執(zhí)行證書透明度要求,這可以防止站點(diǎn)證書錯誤被忽視的情況。當(dāng)站點(diǎn)啟用 Expect-CT CT Header 時,瀏覽器會檢查該站點(diǎn)使用的證書是否出現(xiàn)在公共CT日志中,這能有效的避免中間人攻擊等 HTTPS 威脅,讓站點(diǎn)更加安全。
- Expect-CT: report-uri="<uri>", enforce,max-age=<age>
在部署的時候有兩種策略可供選擇,一種是僅報告,一種是強(qiáng)制執(zhí)行。在僅報告策略中,瀏覽器在沒有收到有效的CT信息情況下,會向report-uri設(shè)置的地址發(fā)送報告。對于該策略,你可以如下設(shè)置:
- Expect-CT: max-age=0, report-uri="https://{$subdomain}.report-uri.com/r/d/ct/reportOnly"
該策略下,如果瀏覽器未收到有效的CT信息,不會終止連接,只會向你指定的URI發(fā)送報告。而第二種策略可如下設(shè)置:
- Expect-CT: enforce, max-age=30, report-uri="https://{$subdomain}.report-uri.com/r/d/ct/enforce"
這也就是告訴瀏覽器強(qiáng)制執(zhí)行 CT 策略并且緩存該狀態(tài) 30s 。如果瀏覽器沒有收到有效的 CT 信息,將會終止鏈接同時也會發(fā)送報告。在正確的配置好 CT 信息后,你可以將該時間設(shè)置的更長。