先聲明,這是只會發生在對外網路受限環境的冷門問題。

工作環境有些主機位於管制網段,預設無法連上 Internet,如要連特定網站需事先申請開通防火牆。發生問題的主機已申請可連至某外部網站 HTTPS 443 Port,使用 IE8 (伺服器不能上網,IE 沒更新)可連上網站,但輸入 URL 後畫面會先空白數十秒才顯示網站,使用 telnet server-domain-name 443 測試建立 TCP 連線速度很正常,檢查確定沒有誤設 Proxy。為了對照測試,特地下載安裝 Chrome (需下載離線安裝版),使用 Chrome 瀏覽該網站順暢無比,另外我還寫了一小段 WebClient.DownloadString("https:// .... ") 實測,下載速度完全正常。測了 IE、telnet、Chrome 跟 .NET WebClient.DownloadString() 獨獨只有 IE 出現網頁載入緩慢的狀況,到底怎麼一回事?

案情膠著,呼叫網站傳輸問題偵察利器 - Fiddler 上場救援,側錄 IE 瀏覽該網站時的網路傳輸,犯人現形。(警察先生,就是這個人)

如上圖所示,IE 在連上該網站之後,接著又呼叫了 httq://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcertstl.cab、httq://rootocsp.twca.com.tw//MFEwTz....、httq://rootca.twca.com.tw/TWCARCA/revoke_2048.crl、httq://rootca.twca.com.tw/TWCARCA/global_revoke_4096.crl 等網址,由於未事先開通無法連線,IE 會等到這些 HTTP Request 逾時後才顯示網頁,可以解釋為何每次要等上一大段時間才能看到網頁。

  • ctldl.windowsupdate.com 是 Windows Vista/7/2008R2 根憑證及註銷憑證自動更新機制的下載來源。參考
  • 目標網站之 SSL 憑證由 TWCA 簽發,rootocsp.twca.com.tw 應為 TWCA 的即時憑證廢止狀態查詢(OCSP,Online Certificate Status Protocol),rootca.twca.com.tw/TWCARCA/*revoke*.crl 則為憑證廢止清單(CRL,Certificate Revocation List),都是用來驗證憑證有效性的機制。延伸閱讀:OCSP & CRL 介紹

由此推測,IE 顯示網頁前的延遲,是在試圖驗證網站 SSL 憑證是否有效,但因網路被封鎖,要一直等到連線逾時才放行的過程(IE7 遇無法驗證會顯示黃色地址列,後來評估此類警示於事無補,改顯示於憑證詳細資訊)。延伸閱讀:Understanding Certificate Revocation ChecksInternet Explorer and revocation check failure

知道問題來源,要解決不難,開啟 IE 網際網路設定,取消「檢查伺服器憑證撤銷」(Check for server certificate revocation )、「檢查發行者的憑證是否被撤銷」(Check for publisher's certificate revocation),IE 顯示網頁延遲的問題頓時消失無蹤。

餘下一個疑問:為什麼 Chrome 沒有這個問題?難道它不用檢查 OCSP?

是的,Chrome 很早之前(2012)便已經放棄 OCSP,理由是:

  1. 受管制網路下的客戶端有可能只被允許連上指定網站不允許連到 CA 網站(如本案例)
  2. 若瀏覽器堅持做完憑證撤銷檢查才顯示網頁,操作會卡住(如本案例)
  3. 瀏覽器集中連至 CA 網站下載 OCSP/CRL,形同 Single Point of Failure
  4. 瀏覽器不能因為連不到 CA 不讓使用者瀏覽(Soft-Fail),攻擊者也可靠阻斷與 CA 連線讓 OCSP/CRL 失效
  5. OCSP 檢查平均耗時 300ms,嚴重拖累效能

因此,Google、微軟、Opera、Firefox 紛紛以軟體更新反應重大事件,輔以自己維護的 CRL 機制(例如:Google CRLSets)取代每次線上檢查。

冷知識再+1。

Found the IE8 has a obviously delay before showing a HTTPS web page under restricted network environment. Using Fiddler, I found it's caused by OCSP/CRL checking and found the way to trun it off.


Comments

Be the first to post a comment

Post a comment


59 - 19 =