你不在意的HTTPS證書吊銷機制

美團SRC發表於2019-08-01

原創 | 陳馳 (CFC4N)


現任美團安全部技術專家,十年以上網際網路產品研發經驗,專注於分散式系統架構設計,目前主要從事安全防禦產品研發工作。


緣起

偶刷《長安十二時辰》,午睡時,夢到我穿越到了唐朝,在長安城中的靖安司,做了一天的靖安司司丞。


當徐賓遇害消失的時候我不在司內,當時的情形我不得而知。後來徐賓醒了,據他描述說“通傳陸三”是暗樁,險些致徐賓於死地。而擅長大案牘術的高智商人才居然被一個普通通傳的幾句話騙至險境,實在丟了我的臉。


你不在意的HTTPS證書吊銷機制


陸三是通傳,熟知靖安司的號令傳遞系統望樓訊號,他是暗樁的訊息,傳遍整個機構。這讓張小敬和姚汝能認為望樓系統已無法完成訊息保密傳送的功能,其實他們根本不瞭解這望樓。 


你不在意的HTTPS證書吊銷機制


整個望樓系統由“傳遞系統+加密系統”組成,靖安司作為一個軍事級別的機構,資訊傳遞絕對是多重加密的。只看懂望樓圖案,或者只有密碼本都是破譯不了密碼的,對於通傳陸三是暗樁的影響,也只需要更換密碼本即可。這些可是我學了RSA非對稱加密後設計的望樓系統,早就評估過這些風險了。即使HTTPS通訊中,丟了金鑰也...


嗯?如果HTTPS證書私鑰丟了,會怎樣?是不是也沒法防範這個私鑰被利用了?


想到這個問題,我突然從夢中驚醒,去溫故一下證書吊銷機制。


疑問

  • HTTPS的證書過期是誰來判斷?
  • 證書的合法性又是誰檢查的呢?
  • 什麼時候觸發?
  • 影響效能嗎?
  • 如何吊銷證書?
  • HTTPS的請求是客戶端(瀏覽器)發起的,他是如何知道證書被吊銷的?
  • 驗證HTTPS證書的過程是什麼樣的?


HTTPS通訊過程

大家都清楚,HTTPS的握手是在TCP握手完成後,流程都熟的很,但還是要溫故一下: 


你不在意的HTTPS證書吊銷機制

1.第一個階段,完成 Client Hello、Server Hello等握手。包含使用SSL版本、伺服器和客戶端的隨機數、密碼套件、資料壓縮等引數響應。


2.第二階段,服務端把域名證書的公鑰下發給瀏覽器(客戶端),瀏覽器(客戶端)校驗證書合法性。


3.第三階段,客戶端把自己的證書傳送給服務端(證書登陸的情況下),服務端檢測客戶端證書等。


4.第四階段,完成金鑰協商、對稱加密金鑰交換。


(簡稱解釋:RN: Random Number;PMS: Pre Master Secret;MS: Master Secret)


對於第二階段中的證書檢驗這塊,相信很多人都不太瞭解,甚至都不知道會檢驗什麼內容,那麼下面我們就來了解一下。


證書完整性驗證

使用RSA公鑰解密來驗證證書上的私鑰簽名是否合法,如果簽名無效,則可認定證書被修改,直接報錯。


證書有效性驗證

CA在頒發證書時,都為每個證書設定了有效期,包括開始時間與結束時間。系統當前時間不在證書起止時間的話,都認為證書是無效的。


證書吊銷狀態檢測

如果,證書在有效期之內需要丟了怎麼辦?需要吊銷證書了,那麼這裡就多了一個證書吊銷狀態的檢測。使用者將需要吊銷的證書通知到CA服務商,CA服務商通知瀏覽器該證書的撤銷狀態。


來看一個證書吊銷後的瀏覽器提醒:

你不在意的HTTPS證書吊銷機制

Chrome返回了NET::ERR_CERT_REVOKED,並且拒絕繼續訪問,更不提供強制訪問的介面,沒了繼續訪問的手動點選連結。


驗證發行者

HTTPS數字證書的使用分兩個角色:

  • 證書發行方issuer,有簽名金鑰的私鑰。
  • 證書申請方subject,使用證書公鑰進行身份驗證的使用者 瀏覽器檢查證書的發行者欄位與證書路徑中上級證書的subject欄位相同。


為了增加安全性,PKI在實現時,多數都驗證了發行方的金鑰、簽名等資訊是否跟當前證書的金鑰相同。但對於信任鏈來說,根證書自己簽發的,也就是說它們的issuer和subject是一樣的。


同時,這些CA根證書都是被作業系統、瀏覽器等直接打入系統的。比如:

你不在意的HTTPS證書吊銷機制

檢查域名(IP)規範

中間CA提供了對域名證書的管理以及頒發的顆粒度度控制。證書的生效範圍會限於固定域名、域名範圍(包括子域)或者固定IP。比如下圖是https://www.baidu.com的HTTPS證書DNS資訊。

你不在意的HTTPS證書吊銷機制


上圖所示,DNS範圍包含了多個域名,同時二級以及二級以上域名都支援範圍形式。以*通配義字元表示。但*.example.com的二級域名範圍就不能包含a.b.example.com這個三級域名。同時,DNS範圍也支援IP的,只是IP不支援範圍形式,必須把所有IP列表都放入列表中。


檢查策略約束

法律策略相關檢測(略)。


證書的吊銷狀態檢測方式

上面提到了瀏覽器(客戶端)在驗證證書合法性時的驗證範圍,我們暫時只關注證書吊銷資訊的檢測,下面我們仔細來了解一下兩種檢測機制的實現原理。


1. Certificate Revocation Lists (CRL)

CA會定期更新發布撤銷證書列表,Certificate Revocation Lists (以下簡稱CRL),RFC 5280:Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile。CRL分佈在公共可用的儲存庫中,瀏覽器可以在驗證證書時獲取並查閱CA的最新CRL。


該方法的一個缺陷是撤銷的時間粒度限於CRL釋出期。只有在計劃更新所有當前釋出的CRL之後,才會通知瀏覽器撤銷。各家簽名CA廠商的策略不一樣,有的是幾小時,有的是幾天,甚至幾周。


2015年,美國幾所大學的學生論文中,統計了當時的CA證書吊銷情況,如下圖: 

你不在意的HTTPS證書吊銷機制

這個統計可以看出,CA證書廠商的CRL數量不一,大部分是30-50個,而GoDaddy有300多個CRL的地址,同時有近30W個證書是吊銷狀態的,檔案大小平均達到了1M。


  • 證書的CRL資訊

CRL資訊是CA在頒發證書時,寫入在X.509 v的擴充套件區域的,比如alipay.com的證書資訊:

你不在意的HTTPS證書吊銷機制

可以看到,其CRL資訊為http://crl3.digicert.com/SecureSiteCAG2.crl 以及http://crl4.digicert.com/SecureSiteCAG2.crl


  • CRL 檢測流程

你不在意的HTTPS證書吊銷機制

可以想象一下,在瀏覽器去校驗證書合法性時,還要去下載一個1M的檔案後,再去校驗。校驗通過後才去連想要訪問的網站伺服器,這相當浪費時間、效率。同時,很多瀏覽器所處網路是有網路訪問限制的,可能在一個區域網,比如我們村,或者物理距離非常遠,存在嚴重的網路延遲問題。


2. Online Certificate Status Protocol (OCSP)

在RFC2560X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP的描述中,瀏覽器從線上OCSP伺服器(也稱為OCSP Response Server)請求證書的撤銷狀態,OCSP Server予以響應。這種方法避免CRL更新延遲問題。同樣的,X.509 v3證書的OCSP資訊也是儲存在擴充資訊中,如alipay.com證書那張圖的綠色框內部分。


  • OCSP 檢測流程

你不在意的HTTPS證書吊銷機制

瀏覽器在獲得Web伺服器的公鑰證書後,開始驗證公鑰的合法性,這裡會向該公鑰的擴充套件資訊中提供的OCSP Server地址傳送OCSP Response,獲得響應後,確認證書有效,再繼續跟Web伺服器通訊。


  • OCSP的優點

相對於CRL方式,證書吊銷後,CA Server可以立刻將吊銷資訊傳送給瀏覽器,生效時間快。響應包內容短,不像CRL的響應包,都將近1M以上。


  • OCSP的缺點

第一個缺點:瀏覽器的每次HTTPS請求建立,都需要連線CA OCSP Server進行驗證,有的瀏覽器所在IP與CA OCSP Server的網路並不是通暢的,比如我們村。而且,OCSP的驗證有網路IO,花費了很長的時間,嚴重影響了瀏覽器訪問伺服器的使用者體驗。


第二個缺點:在瀏覽器傳送伺服器HTTPS證書序號到CA OCSP Server時,也將暴露了使用者的隱私,將使用者訪問的網址透漏給了CA OCSP Server。


  • OCSP機制衍生出來的問題

設想一個場景,你是瀏覽器企業,研發的瀏覽器在檢查證書吊銷狀態時,得不到OCSP server的響應,你會如何選擇?


如果你選擇拒絕該證書資訊,並且拒絕後續的HTTPS通訊,那麼這個方式稱之為Hard-fail

如果你選擇信任該證書,認為沒有被吊銷,那麼這個方式稱之為Soft-fail


如果是hard-fail模式,那瀏覽器對任何HTTPS伺服器訪問的先決條件都取決於OCSP Server,這將是一個致命的單點故障,對於具有資深架構設計經驗的你來說,你會這麼選擇嗎?


如果是soft-fail模式,取不到OCSP Server的響應就忽略了,那麼,要這個機制還有啥意義呢?要你有何用?


  • OCSP Stapling

OCSP Stapling的方案是解決了CRL、OCSP的缺點,將通過OCSP Server獲取證書吊銷狀況的過程交給Web 伺服器來做,Web 伺服器不光可以直接查詢OCSP資訊,規避網路訪問限制、OCSP伺服器離使用者的物理距離較遠等問題,還可以將查詢響應快取起來,給其他瀏覽器使用。由於OCSP的響應也是具備CA RSA私鑰簽名的,所以不用擔心偽造問題。


    • 解決了訪問慢的問題
    • 解決了使用者隱私洩露的問題

你不在意的HTTPS證書吊銷機制

通訊過程如上,但對於Web伺服器在去OCSP Server查詢證書狀態時,也同樣面臨無法獲取到OCSP Response的問題,在響應給瀏覽器時,瀏覽器也還是要面臨hard-fail、soft-fail的選擇問題,這很讓瀏覽器頭大。


  • OCSP Must-Staple

面對hard-fail、soft-fail的問題,各家瀏覽器廠商的態度都不一樣。同時,不管瀏覽器如何選擇,都不能滿足廣大域名使用者的需求,那麼不如把這個選擇交給域名使用者自己。


為此,OCSP Must-Staple應運而生了,瀏覽器必須檢測OCSP響應。域名證書建立時,自定義設定啟用這個選項,將這個資訊打入X.509 v3的擴充套件中,瀏覽器讀取後,強制進行OCSP檢測,走hard-fail模式。這個規範被起草在 X.509v3 Extension: OCSP Stapling Required draft-hallambaker-muststaple-00 ,不過,暫未被採納為RFC標準。


  • CA廠商支援

目前支援該擴充套件的證書的CA廠商有Let's Encrypt。如果使用的是openssl 1.1.0 以前的版本,可以使用11.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05 來指定。RFC 比如生成csr的時候,在openssl.cnf中增加:


[v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05


如果是使用openssl 1.1.0或更高的版本,可以這樣設定:


[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names


各平臺上瀏覽器對證書吊銷的支援情況

1. Mac Safari

在Mac OS X 10.7 (Lion)以後,Safari/macOS預設情況下,不檢測CRLs、OCSP,走自己的key chain體系。(資料比較少,apple官方也搜不到幾條)


2. Windows Internet Explorer

Windows Vista系統開始,Internet Explorer 7瀏覽器內建了CryptoAPI,來支援OCSP方式檢測證書吊銷情況。檢測範圍包括issuer發行商的證書、subject伺服器的證書。


你不在意的HTTPS證書吊銷機制

為什麼IE訪問HTTPS的網站時,會比別的瀏覽器慢?你應該已經知道答案了。


3. Mozilla Firefox

在2010年時,Mozilla Firefox的所有版本都支援OCSP方式檢測。在Firefox 3裡把OCSP檢測機制設定為預設機制。在以後的版本更新中,Firefox針對中級證書跟域名證書做了不同的策略。


  • 中級證書的吊銷狀態驗證

在2015年,Firefox 37開始,針對中級證書的檢測,Mozilla也啟用了自研的證書吊銷狀況檢查機制OneCRL來代替OCSP機制,目的還是想解決CRL、OCSP機制的缺點。而中級證書是不能採用OCSP stapling方式,不允許被快取的。所以...


還有,


RFC 6961 defines a mechanism for stapling OCSP responses for CA certificates. Since FIrefox does not rely on OCSP to validate intermediate certificates, we have no plans to implement support for this.


Firefox 官方短期內並無支援Multi-staple的打算。


  • 域名證書的吊銷狀態驗證

在Firefox的官方WIKI上,提到針對域名證書的吊銷驗證分為如下5個方案:


方案一:Short-Lived Certificates,預設情況下,針對有效期少於10天的證書,直接跳過驗證,認為不安全。可以在security.pki.cert_short_lifetime_in_days引數裡配置。


方案二:OCSP Stapling,跟RFC規範一樣。如果security.OCSP.enabled的值為0,則忽略OCSP response。


方案三:OCSP Must-staple,跟RFC規範一樣。可以通過設定security.ssl.enable_ocsp_must_staple或security.ssl.enable_ocsp_stapling 引數來禁用。


方案四:OCSP,跟RFC規範一樣。如果OCSP的響應在2秒(EV證書是10秒)內沒返回,則直接忽略。


方案五:CRLite,類似Chrome CRLSets的一種檢測機制,用於OCSP、OCSP stapling失敗後的機制。Firefox的官方計劃把這種機制作來代替CRL方式作為主要的檢測機制(OCSP\OCSP stapling失敗後)。


4. Chrome

2012年,Chrome禁用了CRLs、OCSP檢測: Google Chrome Will No Longer Check for Revoked SSL Certificates Online ,使用了自行設計的證書校驗機制 CRLSets


那麼,Chrome這麼選擇的理由是什麼呢?


顯然,通過上面CRL跟OCSP兩種驗證方式的比較來看,前者時效性不行,後者影響效能。那麼,google Chrome就決定自建證書吊銷狀態驗證系統。


Chrome的安全工程師Adam Langley在他的BLOG上寫了一篇文章:《Revocation checking and Chrome's CRL》,對於Chrome的HTTPS證書驗證這塊,Adam Langley可是非常有看法的,非常反對使用CRL、OCSP的方式來校驗證書吊銷狀態,連續寫了好幾篇關於證書吊銷狀態檢測的文章,同時,也在chromium的開發者主頁上的安全板塊有提到【What's the story with certificate revocation?】:


Chrome's primary mechanism for checking the revocation status of HTTPS certificates is CRLsets.


Chrome also supports Online Certificate Status Protocol (OCSP). However, the effectiveness of OCSP is is essentially 0 unless the client fails hard (refuses to connect) if it cannot get a live, valid OCSP response. No browser has OCSP set to hard-fail by default, for good reasons explained by Adam Langley (see [Revocation still doesn't work](No, don't enable revocation checking) and https://www.imperialviolet.org/2014/04/19/revchecking.html).


Stapled OCSP with the Must Staple option (hard-fail if a valid OCSP response is not stapled to the certificate) is a much better solution to the revocation problem than non-stapled OCSP. CAs and browsers are working toward that solution (see the Internet-Draft: http://tools.ietf.org/html/draft-hallambaker-tlssecuritypolicy-03).


Additionally, non-stapled OCSP poses a privacy problem: in order to check the status of a certificate, the client must query an OCSP responder for the status of the certificate, thus exposing a user's HTTPS browsing history to the responder (a third party).


That said, you can use enterprise policies to enable soft-fail OCSP (http://www.chromium.org/administrators/policy-list-3#EnableOnlineRevocationChecks) and hard-fail OCSP for local trust anchors (http://www.chromium.org/administrators/policy-list-3#RequireOnlineRevocationChecksForLocalAnchors).


Chrome performs online checking for Extended Validation certificates if it does not already have a non-expired CRLSet entry covering the domain. If Chrome does not get a response, it simply downgrades the security indicator to Domain Validated.


See also this bug for more discussion of the user-facing UX: https://crbug.com/361820.


但這也不是完美解決了這個問題,來自【An Evaluation of the Effectiveness of Chrome's CRLSets】:


This means that Chrome's CRLSet, which currently lists the serial numbers of 24,206 revoked certificates, reflects only 1.08% of the revoked certificates collected by Websense in one hour.


這篇文章中提到CRLSet的最大問題是包含的證書吊銷資料太少,個別情況下佔了主流CRL證書吊銷資訊的2%不到。而且,CRLSets的更新也不是那麼及時,chrome為了使用者體驗,為了效能,為了使用者隱私,犧牲了一點點安全性,也是可以理解的。但好像對不起最安全瀏覽器的稱號了。[手動狗頭]


彙總


你不在意的HTTPS證書吊銷機制

如上圖,在2015年,Northeastern University、University of Maryland、Duke University等幾所大學的研究人員分析了市場上流行的五個瀏覽器(多個平臺、多個版本),把各個瀏覽器在不同級別證書下的支援情況繪製了表格。(論文在參考文獻中給出)


從圖中可以看出,我們印象中最安全的瀏覽器Chrome表現卻讓你大跌眼鏡,在HTTPS的安全性這塊,表現最差。上面我們也談到,chrome為了訪問速度隱私等使用者體驗考慮,忽略了CRL、OCSP等證書吊銷狀態檢測機制,犧牲了TLS這塊的安全性支援。


而IE瀏覽器卻出乎我們意料,在HTTPS的安全性這塊,支援的非常好,可以說是這幾個瀏覽器中最安全的了,可是...可是他網頁開啟速度慢啊...


截至至今天(2019年7月16日),已經4年過去了,很多瀏覽器、WebServer的支援情況也有很大的變化,並不能反映出當下網際網路的現狀,這些資料也作為參考吧。


附:WebServer的支援情況

The Apache web server has supported OCSP stapling since v2.3.3 (ref).

The nginx web server has supported OCSP stapling since v1.3.7 (ref).


總結

證書洩露的危害

那麼,證書丟了,會對網站安全產生很大影響嗎?回頭看下使用該證書的條件:


  • 具備證書
  • 具備域名
  • 瀏覽器訪問該伺服器


如果幾個都具備,那麼你就是該網站的官方了。


在安全界,有個攻擊手段,叫Man-in-the-middle attack中間人攻擊,如果證書被黑客拿到,搭建一個具備相同域名的網站,通過DNS汙染的方式使得使用者瀏覽器訪問該域名,那麼可以成為一個反向代理,把使用者的請求解析後,偽造程客戶端來跟真實的Web伺服器通訊,從而獲取雙方通訊的明文資訊,達到攻擊的目的。 

你不在意的HTTPS證書吊銷機制

那這種情況怎麼防範?中間人攻擊的防禦方式是開啟客戶端對證書的認證,但你的證書私鑰又丟了,那能咋辦?


通過本文前面章節的瞭解到,這種情況,也只能主動到CA廠商那申請證書吊銷了,不管有幾個瀏覽器支援,也得申請,畢竟,這損失能減少一點是一點。


證書洩露了怎麼辦?

證書洩露了怎麼辦?從瀏覽器的支援情況來看,好像及時申請吊銷了證書,也不能對丟失的證書起到太大的防範作用,很多瀏覽器並不是很支援的嘛。


不過,多少也能避免一些損失,畢竟IE瀏覽器對這塊的支援力度還是很大的嘛。


本文的參考文獻,大部分都是5-6年前的資料,這麼多年過去了,網際網路技術產品日新月異,裡面很多結論早已不符合現狀,尤其是瀏覽器當今對證書吊銷狀態檢測的支援情況。部分內容,僅作為參考,便於讀者去了解技術變遷的背景知識。


參考文獻

RFC3280 Internet X.509 Public Key Infrastructure Certificate

High-reliability OCSP stapling and why it matters

Security Certificate Revocation AwarenessThe case for “OCSP Must-Staple”

Security Certificate Revocation AwarenessSpecific Implementations

Security Sidebar: My Browser Has No Idea Your Certificate Was Just Revoked

SSL certificate revocation and how it is broken in practice

Revoking Intermediate Certificates: Introducing OneCRL

Revocation doesn't work (18 Mar 2011)

Revocation checking and Chrome's CRL (05 Feb 2012)

No, don't enable revocation checking (19 Apr 2014)

Revocation still doesn't work (29 Apr 2014)

An End-to-End Measurement of Certificate Revocation in the Web’s PKI


結束

嗯?話說《長安十二時辰》中望樓訊息傳送機制的加固呢?嗨,夢都醒了,誰還記得這事啊。



團 隊 介 紹

美團安全部的大多數核心人員,擁有多年網際網路以及安全領域實踐經驗,很多同學參與過大型網際網路公司的安全體系建設,其中也不乏全球化安全運營人才,具備百萬級IDC規模攻防對抗的經驗。安全部也不乏CVE“挖掘聖手”,有受邀在Black Hat等國際頂級會議發言的講者,當然還有很多漂亮的運營妹子。

目前,美團安全部涉及的技術包括滲透測試、Web防護、二進位制安全、核心安全、分散式開發、大資料分析、安全演算法等等,同時還有全球合規與隱私保護等策略制定。我們正在建設一套百萬級IDC規模、數十萬終端接入的移動辦公網路自適應安全體系,這套體系構建於零信任架構之上,橫跨多種雲基礎設施,包括網路層、虛擬化/容器層、Server 軟體層(核心態/使用者態)、語言虛擬機器層(JVM/JS V8)、Web應用層、資料訪問層等,並能夠基於“大資料+機器學習”技術構建全自動的安全事件感知系統,努力打造成業界最前沿的內建式安全架構和縱深防禦體系。

隨著美團的高速發展,業務複雜度不斷提升,安全部門面臨更多的機遇和挑戰。我們希望將更多代表業界最佳實踐的安全專案落地,同時為更多的安全從業者提供一個廣闊的發展平臺,並提供更多在安全新興領域不斷探索的機會。


一 個 廣 告

美團安全2019年招聘火熱進行中~

如果你想加入我們,歡迎簡歷請發至郵箱zhaoyan17@meituan.com。



相關文章