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