1. 程式人生 > 其它 >根證書、伺服器證書、使用者證書的區別

根證書、伺服器證書、使用者證書的區別

https證書包含的檔案

ca.cer 中間證書和根證書
nginx.cn.cer 你申請的ssl證書
fullchain.cer 包括了 ca.cer 和 nginx.cn.cer 的全鏈證書
nginx.cn.key 證書的私鑰

什麼是證書鏈

證書鏈的意思是有一個證書機構A,A生成證書B,B也可以生成證書C,那麼A是根證書。

作業系統預先安裝的一些根證書,都是國際上很有權威的證書機構,比如 verisign 、 ENTRUST 這些公司。

我們普通申請的ssl證書都是這些根證書的孫證書。根證書籤發中間證書,中間證書籤發ssl證書。

證書鏈的順序是:ssl證書+中間證書+根證書。證書鏈上的每個證書都是被它相鄰的證書籤發。

證書以證書鏈的形式存在, 只有當整個證書鏈上的證書都有效時,才會認定當前證書合法 :

  1. 最上層為root,也就是通常所說的CA,用來頒發證書
  2. 最下層為end-user,對應是每個網站購買使用的ssl證書
  3. 中間一層為intermediates,是二級CA,這一層可以繼續劃分為多層,用來幫助root給end-user頒發證書。

瀏覽器中證書的驗證順序是

首先檢查你購買的ssl證書的簽發者是不是可信根證書,如果不是那麼會檢查你的證書的簽發機構是否被可信根證書籤發,以此類推,直到找到一個可信的根證書,標示你的證書是可信的,如果找不到那麼你的證書是不可信的。

根證書是用來簽發證書的,不參與通訊,一般會內建在客戶端的瀏覽器中。如果伺服器沒有安裝中間證書,那麼對於某些非主流瀏覽器、安卓手機裝置,應用程式等可能沒辦法驗證ssl證書的真實性,所以為了相容所有客戶端,伺服器需要安裝中間證書。

例如下面圖中情況:你從證書2處購買了證書3,但是證書2不是預設包含在瀏覽器種的可信證書,中間證書2是根證書1簽發的證書,如果伺服器端只發送證書3不包含證書2,那麼瀏覽器找不到證書3的簽發者證書2,這樣整個證書的驗證鏈條就斷裂了,你的證書就會被瀏覽器標識為無效證書“Invalid certificate” 或 “certificate not trusted”

總結

根證書是第三方被大家信任的認證機構自簽名的證書,通常瀏覽器會內建。

伺服器證書是包含包含“ssl證書+中間證書”的證書鏈,對於某些不知名的中間證書,瀏覽器是不內建,伺服器需要把ssl證書連同中間證書一起傳送給瀏覽器,如果證書鏈不全,你的證書在這些瀏覽器上會不被信任。

使用者證書有兩種理解,如果對於證書頒發機構和伺服器來說你可以理解為你申請的ssl證書;對於伺服器-客戶端互動來說是客戶端的證書,比如我們的u盾。

大家可能有一個疑問,伺服器上要不要安裝根證書?從上面分析可以知道,瀏覽器是內建了根證書,不需要我們在伺服器的證書鏈上加根證書。

如何安裝中間證書?不同web伺服器有不同的設定,apache有個變數SSLCertificateChainFile專門對應中間證書bundle,Nginx需要把ssl證書和中間證書打包為一個檔案。

證書格式轉換

cer和pem格式檔案都是證書檔案,key檔案是私鑰檔案,證書機構會將兩種格式的檔案發放給客戶。

pem或cer格式轉為JKS格式檔案包括公鑰和私鑰

第一步:在openssl命令列下輸入如下命令,將pem或cer證書轉pfx格式,回車後需要輸入兩次密碼

pkcs12 -export -out server.pfx -inkey server.key -in server.pem(server.cer)

第二步:在命令列下使用java 的keytool工具,將pfx檔案轉換成jks檔案

keytool -importkeystore -srckeystore server.pfx -destkeystore server.jks -srcstoretype PKCS12 -deststoretype JKS

pem格式證書轉成cer格式

先在終端cd到檔案目錄下 然後

openssl x509 -outform der -in xxx.pem -out yyy.cer

或者直接把pem檔案雙擊匯入鑰匙串,然後再鑰匙串裡右鍵匯出

(xxx 是原證書的名稱,yyy是轉格式生成的證書名稱)

crt格式轉成der格式

先在終端cd到檔案目錄下 然後

openssl x509 -in xxx.crt -out yyy.der -outform DER

(xxx 是原證書的名稱,yyy是轉格式生成的證書名稱)

參考:

https://support.dnsimple.com/articles/what-is-ssl-certificate-chain/
https://knowledge.digicert.com/solution/SO16297.html