證書文件編碼格式介紹

轉(zhuǎn):https://blog.csdn.net/mycoolx/article/details/6730435

OpenSSL中雖然使用PEM作為基本的文件編碼格式,但是,由于不同的對(duì)象其封裝和標(biāo)準(zhǔn)格式不太一樣,所以經(jīng)常會(huì)導(dǎo)致讀者產(chǎn)生迷惑。

一、數(shù)據(jù)編碼格式

??????? 首先介紹一下ASN.1(Abstract Syntax Notation One)標(biāo)準(zhǔn),這是一種描述數(shù)字對(duì)象的方法和標(biāo)準(zhǔn)。ASN1是一種結(jié)構(gòu)化的數(shù)字對(duì)象描述語言,它包括兩部分:數(shù)據(jù)描述語言(ISO 8824)和數(shù)據(jù)編碼規(guī)則(ISO 8825)。ASN.1的數(shù)據(jù)描述語言允許用戶自定義基本的數(shù)據(jù)類型,并可以通過簡單的數(shù)據(jù)類型組成更復(fù)雜的數(shù)據(jù)類型。比如:一個(gè)復(fù)雜的數(shù)據(jù)對(duì)象,如X.509證書,就是在其他一些數(shù)據(jù)類型上定義的,而其他數(shù)據(jù)類型又是在更基本的數(shù)據(jù)類型上建立的,直到回溯到定義的最基本的數(shù)據(jù)類型。

??????? ASN.1提供了多種數(shù)據(jù)編碼方法。包括了BER、DER、PER和XER等。這些編碼方法規(guī)定了將數(shù)字對(duì)象轉(zhuǎn)換成應(yīng)用程序能夠處理、保存和網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制編碼形式的一組規(guī)則。目前經(jīng)常被采用的是BER(Basic Encode Rules)編碼,但是BER編碼具有編碼不唯 一的性質(zhì),也就是說,一個(gè)相同的對(duì)象通過BER編碼可能會(huì)產(chǎn)生幾種不同的編碼數(shù)據(jù)。所以,在OpenSSL和其他密碼學(xué)相關(guān)軟件中經(jīng)常使用BER的一個(gè)子DER(Distinguished Encoding Rules)。對(duì)于每一個(gè)ASN.1對(duì)象,使用DER編碼得出的二制編碼碼數(shù)據(jù)是唯 一的。

??????? PEM編碼全稱是Privacy Enhanced Mail,是一種保密郵件的編碼標(biāo)準(zhǔn)。通常來說,對(duì)信息的編碼過程基本如下。

信息轉(zhuǎn)換為ASCII碼或其他編碼方式,比如采用DER編碼。

使用對(duì)稱加密算法加密經(jīng)過編碼的信息。

使用BASE64對(duì)加密碼后的信息進(jìn)行編碼。

使用一些頭定義對(duì)信息進(jìn)行封裝,主要包含了進(jìn)行正確解碼需要的信息,頭定義的格式形式如下:

Proc-Type:4,ENCRYPTED

DEK-Info:cipher-name,ivec

其中,第一個(gè)頭信息標(biāo)注了該文件是否進(jìn)行了加密,該頭信息可能的值包括ENCRYPTED(信息已經(jīng)加密和簽名),MIC-ONLY(信息經(jīng)過數(shù)據(jù)簽名但沒有加密),MIC-CLEAR(信息經(jīng)過數(shù)字簽名但是沒有加密,也沒有進(jìn)行編碼,可使用非PEM格式閱讀),以及CLEAR;第二個(gè)頭信息標(biāo)注了加密的算法及對(duì)稱加密塊算法使用的初始向量。

在這些信息的前面加上如下形式頭標(biāo)注信息:

---BEGIN PRIVACY-ENHANCED MESSAGE---

在這些信息的后面加上如下形尾標(biāo)注信息:

---END PRIVACY-ENHANCED MESSAGE---

OpenSSL的PEM編碼基本上是基于DER編碼之上的,也就是說,它在上述第一步采用的是DER編碼,所以,從本質(zhì)上來說,OpenSSL的PEM編碼就是在DER編碼基礎(chǔ)上進(jìn)行BASE64編碼,然后添加一些頭尾信息組成的。

二、證書標(biāo)準(zhǔn)

??????? 數(shù)據(jù)編碼格式提供了封裝數(shù)據(jù)的基本方法,但是,對(duì)于具體的數(shù)據(jù)對(duì)象,比如證書,根據(jù)其包含的內(nèi)容的不同,還有更具體的表達(dá)式。

??????? 1、X.509證書

??????? 目前總的來說有三種常用的證書編碼格式:X.509證書、PKCS#12證書和PKCS#7證書。X.509證書是最經(jīng)常使用的證書,它僅包含了公鑰信息而沒有私鑰信息,是可以公開進(jìn)行發(fā)布的,所以X.509證書對(duì)象一般都不需要加密。

??????? X.509證書的格式通常如下:

???????????????? ……相關(guān)的可讀解釋信息(省略)……

???????????????? ---BEGIN CERTIFICATE---

???????????????? ……PEM編碼的X.509證書內(nèi)容(省略)……

???????????????? ---END CERTIFICATE---

???????????????? 除了“---BEGIN CERTIFICATE---”和“---END CERTIFICATE---”頭尾格式外,還可能有這樣不同的標(biāo)識(shí)符:“---BEGIN X.509 CERTIFICATE---”、“---END X.509 CERTIFICATE---”或者“---BEGIN TRUSTED CERTIFICATE---”、“---END TRUSTED ???????? CERTIFICATE---”

??????? 在OpenSSL實(shí)際簽發(fā)的證書文件中最前面的很多可讀的證書明文解釋,只是為了增加證書文件的可讀性,并不代表真正的數(shù)據(jù)。在其他軟件中,比如Windows軟件,可能并不支持這些額外的明文信息,所以,先要將“---BEGIN CERTIFICATE---”之前的所有可讀信息去掉??梢允謩?dòng)刪除,也可以使用PEM到PEM的證書格式轉(zhuǎn)換去掉這些明文可讀信息。

??????? 在Windows平臺(tái),X.509證書文件的后綴名經(jīng)常是der、cer或者crt,都是可以被自動(dòng)識(shí)別的。對(duì)于OpenSSL來說,后綴名是沒有實(shí)際意義的。

????? 2、Netscape證書標(biāo)準(zhǔn)

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

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

三、證書封裝

??????? 1、PKCS#12證書

??????? PKCS#12 證書不同于X.509證書,它可以包含一個(gè)或多個(gè)證書,并且還可以包含證書對(duì)應(yīng)的私鑰。PKCS#12的私鑰是經(jīng)過加密的,密鑰由用戶提供的口令產(chǎn)生。所以,無論在使用PKCS#12證書的時(shí)候一般會(huì)要用用戶輸入密鑰口令。

??????? PKCS#12證書文件在Windwos平臺(tái)和Mozzila中支持的后綴名是p12或者pfx,如果要在IE或者M(jìn)ozzila 中正確使用自己的證書,那么一般來說都要求轉(zhuǎn)換成包含公鑰和私鑰的PKCS#12證書忖入到相關(guān)軟件中。

??????? 2、PKCS#7

??????? PKCS#7可以封裝一個(gè)或多個(gè)X.509證書或者PKCS#6證書(PKCS#6是一種證書格式,但是并不經(jīng)常使用)、相關(guān)證書鏈上的CA證書,并且可以包含CRL信息。PKCS#7不包含私鑰信息。PKCS#7可以將驗(yàn)證證書需要的整個(gè)證書上的證書都包含進(jìn)來,從而方便證書的發(fā)布和正確使用。這樣就可以直接把PKCS#7證書發(fā)給驗(yàn)證方驗(yàn)證,免去了把以上的驗(yàn)證內(nèi)容一個(gè)一個(gè)發(fā)給接書方的煩瑣了。

??????? PKCS#7文件在Windows平臺(tái)的合法后綴名是p7b。??

????? 3、PKCS#8

??????? PKCS#8標(biāo)準(zhǔn)是一個(gè)非常簡單的標(biāo)準(zhǔn),它主要用于封裝私鑰和其他相關(guān)的屬性信息。一般來說,PKCS#8格式的私鑰都是被加密的,支持PKCS#5和PKCS#12標(biāo)準(zhǔn)定義的算法,當(dāng)然,私鑰也可以不加密。PKCS#8標(biāo)準(zhǔn)一方面可以增強(qiáng)私鑰的安全性,另一方面也為用戶提供了一種簡單的確立信任關(guān)系的方式,這主要是基于私鑰特別名稱和最高層可信者的權(quán)威公鑰等屬性信息。

??????? OpenSSL提供的經(jīng)過PEM編碼的PKCS#8標(biāo)準(zhǔn)的文件,分為加密和非加密的兩種方式。加密的PKCS#8密鑰標(biāo)識(shí)如下:

??????? ——BEGIN ENCRYPTED PRIVATE KEY——

??????? ——END ENCRYPTED PRIVATE KEY——

??????? 非加密的PKCS#8密鑰標(biāo)識(shí)如下:

??????? ——BEGIN PRIVATE KEY——

??????? ——END PRIVATE KEY——


四、密鑰編碼

??????? 密鑰有多種形式的,很多情況下,需要把這些密鑰保存下來。通常使用PEM和DER兩種編碼方式對(duì)要保存的密鑰進(jìn)行編碼。

??????? DER 編碼存儲(chǔ)的密鑰文件是不可讀的,如果用文本編輯器打開它,將看到一些難以理解的符號(hào),因?yàn)檫@是一個(gè)二進(jìn)制編碼的文件。PEM則不一樣,它要友好得多,因?yàn)镻EM經(jīng)過BASE64編碼。用文本編輯器打開PEM編碼的密鑰文件,可以看到跟證書類似,它們真正的編碼都包含在類似于:---BEGIN XXXXXX---和---END XXXXXX--- 這樣的符號(hào)對(duì)內(nèi)。

??????? 密鑰總的來說有兩種,一種是可以公開的(比如公開密鑰對(duì)的公鑰),一種是不能公開的(比如公開密鑰對(duì)的私鑰)。反映在編碼上,有的密鑰文件需要加密,有的就不需要加密。一個(gè)經(jīng)過加密的PEM編碼密鑰文件在上述的符號(hào)內(nèi)會(huì)增加一些頭信息,這些頭信息主要是為密鑰解密的時(shí)候提供有用的信息,包括標(biāo)記密鑰加密狀態(tài)、使用加密算法及初始賂量(對(duì)于塊加密算法來說)。例如:

---BEGIN RSA PRIVATE KEY---

Proc-Type:4,ENCRYPTED

DEK-Info:DES-ED3-CBC,86B0167E005535D2

……(加密內(nèi)容密鑰部分)……

---END RSA PRIVATE KEY---

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

五、其他標(biāo)準(zhǔn)

??????? 證書吊銷列表(CRL)是用戶驗(yàn)證證書的重要參考資料,它主要包含了無效的證書列表,告訴用戶哪些證書已經(jīng)吊銷或無效的。如果 沒有CRL,可以選擇另一種驗(yàn)證方式,那就是使用在線證書服務(wù)協(xié)議(OCSP)。OCSP并不總是能夠使用,比如你的網(wǎng)絡(luò)有時(shí)候可能不能接通OCSP服務(wù)器。CRL 是一種相對(duì)方使用和獨(dú)立的解決方案,只要獲取了CA中心提供的在有效期內(nèi)的CRL,基本上就能對(duì)證書的有效性進(jìn)行驗(yàn)證。PEM格式編碼的CRL一般包含在一對(duì)符號(hào)內(nèi):“---BEGIN X.509 CRL---”和“---END X.509 CRL---”。也可以使用DER格式保存CRL。

---------------------

作者:coolx-w

來源:CSDN

原文:https://blog.csdn.net/mycoolx/article/details/6730435

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容