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