證書文件編碼格式介紹

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。


發佈了35 篇原創文章 · 獲贊 14 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章