前幾講都在講SSL證書,這一講講一講瀏覽器是如何驗證SSL證書的,瀏覽器在CA/瀏覽器論壇中被定義為SSL證書的Consumer(消費者),什么是消費者?消費者是上帝哦。這就是為何筆者一直在說瀏覽器廠商在CA/瀏覽器論壇中是強勢方,那我們就看看強勢在哪?
瀏覽器是用戶上網的入口,當然需要擔當起保護用戶上網安全的責任。當用戶使用瀏覽器以http方式上網時,瀏覽器會提示“不安全”,這不是瀏覽器嚇唬用戶,是真的不安全,因為http是明文傳輸協議,從瀏覽器到云端服務器之間明文傳輸的信息非常容易被非法竊取和非法篡改。筆者很遺憾的看到現在的微信等常用App的內置瀏覽器訪問http網站時并沒有提示“不安全”,這實際上是在傷害用戶!
如果用戶使用瀏覽器訪問的網站啟用了https協議,則瀏覽器就開啟了SSL證書的驗證流程,主要有如下9個方面的驗證,各個瀏覽器的驗證項都有所不同,但是主流瀏覽器基本上都會驗證前5項。
1.驗證SSL證書綁定的域名是否正確
瀏覽器使用https協議同Web服務器握手時,首先會從服務器返回的SSL證書中解析出證書綁定的域名,如果SSL證書綁定的域名同用戶請求連接的網址不一致,則瀏覽器提示“不安全”并終止連接。如下左圖所示,本地host解析www.boc.cn到另一個網站: sm2test.cersign.cn 的IP地址上,瀏覽器會提示“不安全”,具體錯誤信息是:ERR_CERT_COMMON_NAME_INVALID (域名不匹配),因為此網站部署的SSL證書綁定的域名不是www.boc.cn而是sm2test.cersign.cn,如下右圖所示,這就有效地保護了用戶不會被假冒銀行的網站所欺騙。
但是,目前的各種APP(包括微信)連接https服務時不判斷域名是否匹配就稀里糊涂的與之連接,這會導致用戶在假冒的銀行網站輸入的銀行卡密碼!域名不匹配絕大多數是遭遇了DNS攻擊指向了假冒網站,而不判斷域名是否匹配的問題就讓攻擊者輕松得到了用戶的銀行卡密碼。但是,如果APP能像瀏覽器一樣實時驗證正在連接的Web服務器的SSL證書中綁定的域名是否匹配的話就能防范這類攻擊。各種APP同瀏覽器一樣都是上網客戶端軟件,都應該學習瀏覽器是如何正確驗證SSL證書的,這是筆者講瀏覽器是如何驗證SSL證書的主要目的。
2.驗證SSL證書是否可信
瀏覽器在驗證了證書綁定的域名同用戶訪問的域名一致后,就要驗證SSL證書是否是瀏覽器信任的證書。瀏覽器使用https協議同Web服務器握手時就獲得了網站部署的SSL證書和證書鏈,首先驗證SSL證書是否是所聲稱的中級根證書簽發,如果是則繼續驗證中級根證書的簽發者是誰,一般就是瀏覽器信任的頂級根證書,如果是已經預置信任的某個頂級根證書簽發的中級根證書,則表明證書鏈可信。但這時候瀏覽器不會馬上顯示加密鎖標識,還需要做其他判斷。
如果簽發SSL證書的根證書不是瀏覽器信任的,則瀏覽器會提示“不安全”,具體錯誤信息是:ERR_CERT_AUTHORITY_INVALID (根證書不受信任)。但是,這個必須驗證證書是否可信的步驟很多APP也沒有做到,后果非常嚴重,因為假冒銀行網站可以自簽一張綁定正確的網銀網址的SSL證書,如果APP不驗證SSL證書是否是操作系統信任的證書,或者驗證是否是APP信任的SSL證書,則一樣可能會遭遇DNS劫持后的中間人攻擊。安全的做法是不僅要驗證SSL證書是操作系統信任的證書,而且應該驗證證書是否是由本單位指定的CA機構的中級根證書簽發,以防止可能的從操作系統信任的其他CA非法獲得的綁定服務器域名的證書的惡意攻擊。而對于一些重要的系統,如政務APP、支付APP,筆者推薦定制本單位專用中級根證書來為這些系統簽發SSL證書,這樣就能做到APP只信任本單位專用中級根證書簽發的SSL證書,只有這樣才能做到萬無一失。
為了防止瀏覽器把可信的SSL證書由于無法驗證證書鏈而誤判為不信任的證書,用戶必須在部署SSL證書時同時附上中級根證書,這樣瀏覽器在同服務器握手時就能快速驗證證書鏈,快速顯示加密鎖標識。而零信瀏覽器同時做了更多的改進,如果握手時沒有拿到中級根證書,則會通過證書中的AIA信息去獲取中級根證書,并在驗證后寫入本地數據庫供下次使用。如果證書中沒有AIA信息或AIA網址不可用,而本地庫也沒有中級根證書信息,則只能認為是不可信證書了。
3.驗證SSL證書是否已經吊銷
瀏覽器在驗證了SSL證書是可信根簽發后,還會查驗SSL證書是否被吊銷,這是通過訪問證書中的“CRL分發點”字段來獲取證書吊銷列表信息后驗證證書序列號是否在證書吊銷列表中,或者通過訪問證書中的OCSP服務網址來驗證證書是否被吊銷。鑒于OCSP訪問涉及到用戶隱私問題,CA/瀏覽器論壇計劃棄用OCSP服務。
一般情況下,如果用戶懷疑證書私鑰有可能泄露的話(如關鍵人員離職或服務器被攻擊),則必須向CA申請吊銷此證書,重新申請一張新的SSL證書,所以瀏覽器在訪問網站時會檢查吊銷列表,如果證書被吊銷,則瀏覽器一定會顯示為“不安全”,具體錯誤信息是:ERR_CERT_REVOKED (證書已吊銷)。但是,筆者發現多個常用的APP并沒有檢查服務器證書是否被吊銷,則非常危險,因為如果某個網銀用的SSL證書的確是已經泄露的話,則攻擊者就可以用這張證書來成功實現中間人攻擊,因為這張SSL證書是瀏覽器信任的SSL證書。但是,如果APP能像瀏覽器一樣實時驗證證書是否已吊銷的話,則就能及時發現并終止連接,能有效防止攻擊者使用已經吊銷的證書用于竊取網站的機密信息攻擊。
4.驗證SSL證書是否已過期
瀏覽器在驗證了SSL證書是可信根簽發并且沒有被吊銷后,還會查驗SSL證書是否過期,因為所有SSL證書都是有效期的,目前的標準是一年。用戶必須在證書過期前續期證書,否則瀏覽器會顯示“不安全”,具體錯誤信息是:ERR_CERT_DATE_INVALID (證書已過期)。
筆者發現有許多常用的APP居然不檢查證書是否已經過期,如果攻擊者獲得了網銀系統的已經過期的SSL證書,并且部署此過期證書用于攻擊網銀系統,則網銀APP同服務器握手時不檢查證書是否過期,則就會遭遇假冒銀行網銀系統的攻擊!但是,如果APP能實時檢查證書是否過期的話,則一旦發現證書已經過期則馬上終止連接,能有效防止攻擊者利用過期證書的攻擊。
谷歌正在推動SSL證書有效期縮短為90天,也就是說這個政策的改變可能會導致大量的人工部署和管理的SSL證書會在過期時由于忘了續期而使得用戶無法通過瀏覽器正常訪問。所以,大家從這里應該也能理解到SSL證書的自動化管理是何等的重要,實現了自動化管理,就不用擔心證書已過期而忘了續期。
5.驗證SSL證書是否已透明公開披露
在谷歌牽頭推出證書透明之前,瀏覽器在完成了以上4個步驟的檢查后會正常顯示加密鎖標識,讀者如果看過其他類型主題的文章應該就是這些內容了。但是,考慮到CA系統可能會被攻擊而導致惡意簽發瀏覽器信任的綁定某個域名的SSL證書用于惡意攻擊,或者CA機構由于操作失誤或系統錯誤而錯誤簽發了綁定某個并不是用戶申請的域名的SSL證書,怎么辦?這些SSL證書都能正常通過以上4個步驟的檢查。這就要靠證書透明機制來起保護作用了,谷歌瀏覽器要求所有CA機構必須把待簽發的SSL證書提交到通過谷歌瀏覽器認證的證書透明日志系統中獲得日志簽名數據,并把日志簽名數據寫入到SSL證書的“SCT列表”字段中。瀏覽器在最后一步會驗證證書透明信息,如果證書中沒有SCT列表字段,或者SCT列表字段中的日志簽名信息不可信,則瀏覽器一樣會顯示“不安全”,如下左圖顯示,具體錯誤信息是:“ERR_CERTIFICATE_TRANSPARENCY_REQUIRED”(要求證書透明),這是目前谷歌瀏覽器針對所有國際SSL證書如果沒有提交證書透明日志系統的安全警告。而針對沒有提交國密證書透明日志系統的情況,零信瀏覽器目前的處理方式如下右圖所示,只是提示“國密證書不透明”,計劃在2023年7月1日之后會同谷歌瀏覽器一樣提示“不安全”,如下左圖一樣的提示。
6.驗證網站是否采用國密算法實現https加密
這是零信瀏覽器增加的驗證步驟,會在瀏覽器握手時詢問Web服務器是否支持國密算法和國密SSL證書,如果支持,則優先采用國密算法實現https加密。這一點在目前的非常不確定的國際環境下變得非常重要,重要網站部署國密SSL證書是必須的。如果不支持國密算法,則只能采用RSA算法同服務器https加密通信,但是一旦這張用于https加密的SSL證書被吊銷,則瀏覽器就無法正常訪問網站,會像第3步驗證一樣顯示為“不安全”而無法正常實現https加密通信。
如果網站部署了國密SSL證書,則零信瀏覽器會優先采用國密算法實現https加密,并在地址欄的加密鎖標識后面增加顯示國密加密標識,讓用戶對網站是否國密合規一目了然。
目前筆者還沒有發現那個APP支持國密https加密,這值得各種網銀APP和政務APP高度重視,早點著手升級改造APP以支持國密算法和國密SSL證書,只有這樣才不至于出現一旦發生證書被非法吊銷的極端情況時用戶無法使用手機APP,影響移動業務的正常運轉,必須未雨綢繆提前做好準備才能有備無患。
7.驗證并展示網站可信身份
這是零信瀏覽器全球獨家特色服務,零信瀏覽器在完成了所有SSL證書安全驗證后會讀取SSL證書中的身份認證級別OID,如果是EV SSL證書,則顯示綠色地址欄和展示SSL證書中的O字段單位名稱,如下左圖所示。如果是OV SSL證書,則顯示淺綠色地址欄和展示SSL證書中的O字段單位名稱。鑒于目前85%的網站部署的都是無網站身份信息的DV SSL證書,零信瀏覽器獨家創新提供了網站可信認證服務,并對通過EV認證的網站一樣顯示綠色地址欄和展示通過認證的單位名稱,填補了DV SSL證書的身份缺失,如下右圖所示。
8.驗證并展示網站是否有WAF防護
這是零信瀏覽器全球獨家特色服務,零信瀏覽器認證并預置了國內和國際知名的云WAF廠商的云WAF服務特征數據,如果網站有云WAF防護,則會在地址欄展示云WAF防護標識。雖然這個功能同SSL證書驗證無關,但是一個網站是否安全,僅有https加密是不夠的,必須同時有WAF防護。此驗證功能僅在網站部署了SSL證書才會驗證并展示,因為僅有WAF防護而沒有部署SSL證書則網站一樣是不安全的,瀏覽器只會顯示“不安全”,不會展示WAF標識,沒有啟用https加密的WAF防護是沒有意義的投資。
9.完成所有驗證后給網站安全打分
這也是零信瀏覽器全球獨家特色服務,零信瀏覽器會在完成所有SSL證書驗證后根據SSL證書的類型、SSL協議支持、密鑰交換、密碼強度等四個維度來對SSL證書的部署做一個全面的SSL安全體檢打分,再加上網站是否有WAF防護,是否有可信身份認證等指標給網站打一個安全分,讓用戶對網站的安全情況一目了然。這個體檢打分標準是參考著名的Qualys SSL Labs的SSL體驗打分標準的,如下左圖所示為零信瀏覽器對零信官網的體檢打分,如下右圖所示為SSL Labs為零信官網的打分,都是A+。
從以上講解的瀏覽器SSL證書驗證過程可以看出,用戶在地址欄看到加密鎖標識時瀏覽器是做了多個步驟的驗證的,只有通過這些驗證才會顯示加密鎖標識,瀏覽器才會讓用戶安全地同服務器交互。這個嚴格的證書驗證過程非常值得APP開發者和APP運營者學習,自己開發和運營的APP在連接服務端之前一定也要做這些驗證,否則APP是不安全的APP,無法保障用戶同服務器之間交互的機密信息安全。
筆者專門把瀏覽器如何驗證SSL證書作為密碼講堂的一堂課的主要目的就是讓APP開發者和運營者能借鑒非常成熟的瀏覽器的SSL證書驗證過程來完善和提升APP同服務器通信時的安全水平,因為在移動互聯網時代,用戶使用手機的時間已經超過了瀏覽器,APP的安全至關重要,不僅關系到APP用戶更是關系到APP運營方的用戶數據安全和運營數據安全,一定要高度重視。只有所有APP都安全了,才能真正提升我國的互聯網安全水平。