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