前言
我們經常在安裝和部署SSL證書的時候,需要一同安裝中間證書。中間證書到底是什么?為什么必須要安裝?為什么有時候,沒有中間證書,我的IE也能正常訪問HTTPS?為什么其他瀏覽器都OK了,但安卓手機就是不行了!
中間證書是什么
中間證書,其實也叫中間CA(中間證書頒發機構,Intermediate certificate authority, Intermedia CA),對應的是根證書頒發機構(Root certificate authority ,Root CA)。為了驗證證書是否可信,必須確保證書的頒發機構在設備的可信CA中。如果證書不是由可信CA簽發,則會檢查頒發這個CA證書的上層CA證書是否是可信CA,客戶端將重復這個步驟,直到證明找到了可信CA(將允許建立可信連接)或者證明沒有可信CA(將提示錯誤)。
為了構建信任鏈,每個證書都包括字段:“使用者”和“頒發者”。 中間CA將在這兩個字段中顯示不同的信息,顯示設備如何獲得下一個CA證書,重復檢查是否是可信CA。
根證書,必然是一個自簽名的證書,“使用者”和“頒發者”都是相同的,所以不會進一步向下檢查,如果根CA不是可信CA,則將不允許建立可信連接,並提示錯誤。
例如:一個服務器證書 domain.com,是由Intermedia CA簽發,而Intermedia CA的頒發者Root CA在WEB瀏覽器可信CA列表中,則證書的信任鏈如下:
證書 1 - 使用者:domain.com;頒發者:Intermedia CA
證書 2 - 使用者:Intermedia CA;頒發者: Root CA
證書 3 - 使用者:Root CA ; 辦法和: Root CA
當Web瀏覽器驗證到證書3:Root CA時,發現是一個可信CA,則完成驗證,允許建立可信連接。當然有些情況下,Intermedia CA也在可信CA列表中,這個時候,就可以直接完成驗證,建立可信連接。
但如果Web瀏覽器在驗證過程中,沒有找到這個Intermedia CA,那即使Root CA本身是可信CA,但因為WEB瀏覽器無法通過中間證書來發現這個Root CA,最后也會導致無法完成驗證,無法建立可信連接。
要獲得中間證書,一般有兩種方式:第一種、由客戶端自動下載中間證書;第二種、由服務器推送中間證書。以下分別討論。
客戶端自動下載中間證書
一張標准的證書,都會包含自己的頒發者名稱,以及頒發者機構訪問信息: Authority Info Access,其中就會有頒發者CA證書的下載地址。
通過這個URL,我們可以獲得這個證書的頒發者證書,即中間證書。Windows、IOS、MAC都支持這種證書獲取方式,但Android不支持這種方式,所以,如果我們僅依靠這種方式來獲得中間證書,就無法在Android系統上建立可信連接。
除了操作系統支持外,還有一個很重要的因素,就是客戶端可以正常訪問公網。如果客戶端本身在一個封閉的網絡環境內,無法訪問公網下載中間證書,就會造成失敗,無法建立可信連接。
此外,有些CA的中間證書下載地址因為種種原因被“牆”掉了,也會造成我們無法獲得中間證書,進而無法建立可信鏈接。
雖然自動下載中間證書的機制如此不靠譜,但在有些應用中,這卻是唯一有效的機制,譬如郵件簽名證書,由於我們發送郵件時,無法攜帶頒發郵件證書的中間證書,往往只能依靠客戶端自己去下載中間證書,一旦這個中間證書的URL無法訪問(被“牆”掉)就會造成驗證失敗。
服務器推送中間證書
服務器推送中間證書,就是將中間證書,預先部署在服務器上,服務器在發送證書的同時,將中間證書一起發給客戶端。我們部署證書,首先就要找到頒發服務器證書的中間證書,可以用中間證書下載工具 。
如果我們在服務器上不主動推送中間證書,可能會造成的問題
- Android手機無法自動下載中間證書,造成驗證出錯,提示證書不可信,無法建立可信連接。
- Java客戶端無法自動下載中間證書,驗證出錯,可信連接失敗。
- 內網電腦,在禁止公網的情況下,無法自動下載中間證書,驗證出錯,可信連接失敗。
雖然我們不部署中間證書,在大多數情況,我們依然可以建立可信的HTTPS連接,但為了避免以上這些情況,我們必須在服務器上部署中間證書。
所以,為了確保我們在各種環境下都能建立可信的HTTPS連接,我們應該盡量做到以下幾點:
1、必須在服務器上部署正確的中間證書,以確保各類瀏覽器都能獲得完整的證書鏈,完成驗證。
2、選擇可靠的SSL服務商,有些小的CA機構,因為各種原因,造成他們的中間證書下載URL被禁止訪問,即使我們在服務器上部署了中間證書,但也可能存在某種不可測的風險,這是我們應該盡力避免的。
3、中間證書往往定期會更新,所以在證書續費或者重新簽發后,需要檢查是否更換過中間證書。
FYI: https://www.myssl.cn/home/article-0406-42.html