PKI 證書檔案編碼格式介紹

gladmustang發表於2014-12-29

證書檔案編碼格式介紹  


OpenSSL中雖然使用PEM作為基本的檔案編碼格式,但是,由於不同的物件其封裝和標準格式不太一樣,所以經常會導致讀者產生迷惑。


一、資料編碼格式

        首先介紹一下ASN.1(Abstract Syntax Notation One)標準,這是一種描述數字物件的方法和標準。ASN1是一種結構化的數字物件描述語言,它包括兩部分:資料描述語言(ISO 8824)和資料編碼規則(ISO 8825)。ASN.1的資料描述語言允許使用者自定義基本的資料型別,並可以通過簡單的資料型別組成更復雜的資料型別。比如:一個複雜的資料物件,如X.509證書,就是在其他一些資料型別上定義的,而其他資料型別又是在更基本的資料型別上建立的,直到回溯到定義的最基本的資料型別。

        ASN.1提供了多種資料編碼方法。包括了BER、DER、PER和XER等。這些編碼方法規定了將數字物件轉換成應用程式能夠處理、儲存和網路傳輸的二進位制編碼形式的一組規則。目前經常被採用的是BER(Basic Encode Rules)編碼,但是BER編碼具有編碼不唯 一的性質,也就是說,一個相同的物件通過BER編碼可能會產生幾種不同的編碼資料。所以,在OpenSSL和其他密碼學相關軟體中經常使用BER的一個子DER(Distinguished Encoding Rules)。對於每一個ASN.1物件,使用DER編碼得出的二制編碼碼資料是唯 一的。

        PEM編碼全稱是Privacy Enhanced Mail,是一種保密郵件的編碼標準。通常來說,對資訊的編碼過程基本如下。

  1. 資訊轉換為ASCII碼或其他編碼方式,比如採用DER編碼。
  2. 使用對稱加密演算法加密經過編碼的資訊。
  3. 使用BASE64對加密碼後的資訊進行編碼。
  4. 使用一些頭定義對資訊進行封裝,主要包含了進行正確解碼需要的資訊,頭定義的格式形式如下:
    Proc-Type:4,ENCRYPTED
    DEK-Info:cipher-name,ivec
    其中,第一個頭資訊標註了該檔案是否進行了加密,該頭資訊可能的值包括ENCRYPTED(資訊已經加密和簽名),MIC-ONLY(資訊經過資料簽名但沒有加密),MIC-CLEAR(資訊經過數字簽名但是沒有加密,也沒有進行編碼,可使用非PEM格式閱讀),以及CLEAR;第二個頭資訊標註了加密的演算法及對稱加密塊演算法使用的初始向量。
  5. 在這些資訊的前面加上如下形式頭標註資訊:
    ---BEGIN PRIVACY-ENHANCED MESSAGE---
    在這些資訊的後面加上如下形尾標註資訊:
    ---END PRIVACY-ENHANCED MESSAGE---
    OpenSSL的PEM編碼基本上是基於DER編碼之上的,也就是說,它在上述第一步採用的是DER編碼,所以,從本質上來說,OpenSSL的PEM編碼就是在DER編碼基礎上進行BASE64編碼,然後新增一些頭尾資訊組成的。

二、證書標準

        資料編碼格式提供了封裝資料的基本方法,但是,對於具體的資料物件,比如證書,根據其包含的內容的不同,還有更具體的表示式。

        1、X.509證書

        目前總的來說有三種常用的證書編碼格式:X.509證書、PKCS#12證書和PKCS#7證書。X.509證書是最經常使用的證書,它僅包含了公鑰資訊而沒有私鑰資訊,是可以公開進行釋出的,所以X.509證書物件一般都不需要加密。

        X.509證書的格式通常如下:
                 ……相關的可讀解釋資訊(省略)……
                 ---BEGIN CERTIFICATE---
                 ……PEM編碼的X.509證書內容(省略)……
                 ---END CERTIFICATE---
                 除了“---BEGIN CERTIFICATE---”和“---END CERTIFICATE---”頭尾格式外,還可能有這樣不同的識別符號:“---BEGIN X.509 CERTIFICATE---”、“---END X.509 CERTIFICATE---”或者“---BEGIN TRUSTED CERTIFICATE---”、“---END TRUSTED          CERTIFICATE---”

        在OpenSSL實際簽發的證書檔案中最前面的很多可讀的證書明文解釋,只是為了增加證書檔案的可讀性,並不代表真正的資料。在其他軟體中,比如Windows軟體,可能並不支援這些額外的明文資訊,所以,先要將“---BEGIN CERTIFICATE---”之前的所有可讀資訊去掉。可以手動刪除,也可以使用PEM到PEM的證書格式轉換去掉這些明文可讀資訊。
        在Windows平臺,X.509證書檔案的字尾名經常是der、cer或者crt,都是可以被自動識別的。對於OpenSSL來說,字尾名是沒有實際意義的。

      2、Netscape證書標準

        Netscape提供了一種名為Netscap證書序列(Netscape Cerificate Sequence)的格式來封裝一系列證書(實際上裡面採用了一個PKCS#7格式來封裝證書)。以便能夠一次性地下載或者傳輸多個數字證書。所以,某些時候,Netscape證書序列可以替代PKCS#7的作用,用來打包一系列證書。

        Netscape證書序列雖然不一定能夠得到微軟的支援,但是在其他一些開源軟體和Linux軟體中卻得到了廣泛的支援。

三、證書封裝

        1、PKCS#12證書

        PKCS#12 證書不同於X.509證書,它可以包含一個或多個證書,並且還可以包含證書對應的私鑰。PKCS#12的私鑰是經過加密的,金鑰由使用者提供的口令產生。所以,無論在使用PKCS#12證書的時候一般會要用使用者輸入金鑰口令。
        PKCS#12證書檔案在Windwos平臺和Mozzila中支援的字尾名是p12或者pfx,如果要在IE或者Mozzila 中正確使用自己的證書,那麼一般來說都要求轉換成包含公鑰和私鑰的PKCS#12證書忖入到相關軟體中。

        2、PKCS#7

        PKCS#7可以封裝一個或多個X.509證書或者PKCS#6證書(PKCS#6是一種證書格式,但是並不經常使用)、相關證書鏈上的CA證書,並且可以包含CRL資訊。PKCS#7不包含私鑰資訊。PKCS#7可以將驗證證書需要的整個證書上的證書都包含進來,從而方便證書的釋出和正確使用。這樣就可以直接把PKCS#7證書發給驗證方驗證,免去了把以上的驗證內容一個一個發給接書方的煩瑣了。

        PKCS#7檔案在Windows平臺的合法字尾名是p7b。  

      3、PKCS#8

        PKCS#8標準是一個非常簡單的標準,它主要用於封裝私鑰和其他相關的屬性資訊。一般來說,PKCS#8格式的私鑰都是被加密的,支援PKCS#5和PKCS#12標準定義的演算法,當然,私鑰也可以不加密。PKCS#8標準一方面可以增強私鑰的安全性,另一方面也為使用者提供了一種簡單的確立信任關係的方式,這主要是基於私鑰特別名稱和最高層可信者的權威公鑰等屬性資訊。

        OpenSSL提供的經過PEM編碼的PKCS#8標準的檔案,分為加密和非加密的兩種方式。加密的PKCS#8金鑰標識如下:

        ——BEGIN ENCRYPTED PRIVATE KEY——

        ——END ENCRYPTED PRIVATE KEY——

        非加密的PKCS#8金鑰標識如下:

        ——BEGIN PRIVATE KEY——

        ——END PRIVATE KEY——

 


四、金鑰編碼

        金鑰有多種形式的,很多情況下,需要把這些金鑰儲存下來。通常使用PEM和DER兩種編碼方式對要儲存的金鑰進行編碼。

        DER 編碼儲存的金鑰檔案是不可讀的,如果用文字編輯器開啟它,將看到一些難以理解的符號,因為這是一個二進位制編碼的檔案。PEM則不一樣,它要友好得多,因為PEM經過BASE64編碼。用文字編輯器開啟PEM編碼的金鑰檔案,可以看到跟證書類似,它們真正的編碼都包含在類似於:---BEGIN XXXXXX---和---END XXXXXX--- 這樣的符號對內。

        金鑰總的來說有兩種,一種是可以公開的(比如公開金鑰對的公鑰),一種是不能公開的(比如公開金鑰對的私鑰)。反映在編碼上,有的金鑰檔案需要加密,有的就不需要加密。一個經過加密的PEM編碼金鑰檔案在上述的符號內會增加一些頭資訊,這些頭資訊主要是為金鑰解密的時候提供有用的資訊,包括標記金鑰加密狀態、使用加密演算法及初始賂量(對於塊加密演算法來說)。例如:

---BEGIN RSA PRIVATE KEY---
Proc-Type:4,ENCRYPTED
DEK-Info:DES-ED3-CBC,86B0167E005535D2
……(加密內容金鑰部分)……
---END RSA PRIVATE KEY---

        以上的PEM編碼的是RSA(RSA PRIVATE KEY)私鑰,該金鑰經過了加密(ENCRYPTED),使用的是3DES的CBC方式(DES-EDE3-CBC),使用的IV向量是“86B0167E005535D2”。


五、其他標準

        證書吊銷列表(CRL)是使用者驗證證書的重要參考資料,它主要包含了無效的證書列表,告訴使用者哪些證書已經吊銷或無效的。如果 沒有CRL,可以選擇另一種驗證方式,那就是使用線上證書服務協議(OCSP)。OCSP並不總是能夠使用,比如你的網路有時候可能不能接通OCSP伺服器。CRL 是一種相對方使用和獨立的解決方案,只要獲取了CA中心提供的在有效期內的CRL,基本上就能對證書的有效性進行驗證。PEM格式編碼的CRL一般包含在一對符號內:“---BEGIN X.509 CRL---”和“---END X.509 CRL---”。也可以使用DER格式儲存CRL。


相關文章