天天看點

密碼學系列之:PEM和PKCS7,PKCS8,PKCS12簡介PEMPKCS7PKCS8PKCS12總結

簡介

PEM是一種常見的儲存key或者證書的格式,PEM格式的檔案一般來說字尾是以.pem結尾的。那麼PEM到底是什麼呢?它和常用的證書格式PKCS7和PKCS12有什麼關系呢?一起來看看吧。

PEM

PEM雖然使用來存儲證書或者密鑰的,但是PEM原本是和email相關聯的,因為PEM的全稱是Privacy-Enhanced Mail,最初是為郵件的隐私增強而建立的,是在1993年由IETF制定的标準。雖然最終的協定标準并沒有被廣泛采用,但是其中定義的文本編碼卻被廣泛的使用,最終由IETF在RFC 7468中正式化。

之前我們介紹過一種協定描述語言ASN.1,ASN.1通常被用來定義協定中的資料結構,然後通過使用DER編碼來對這些資料進行序列化,但是DER編碼是二進制的格式,二進制檔案在某些情況下不友善進行傳輸或者展示,不然說某些隻支援ASCII編碼的情況,是以需要一種可以講DER格式轉換成為文本格式的方式。

這種方式就叫做PEM。PEM使用的方法也很簡單,就是對DER編碼過後的二進制資料使用base64編碼,将其轉換成為文本檔案。

在PEM中有固定的檔案頭和檔案結尾符。檔案頭是以

-----BEGIN

+label+

-----

開始,檔案結尾是以

-----END

+label+

-----

結束。

其中label表示的是編碼的消息類型,通常可以取這些值:CERTIFICATE, CERTIFICATE REQUEST, PRIVATE KEY 和 X509 CRL。

下面是一個PEM的例子,表示其内容是一個證書:

-----BEGIN CERTIFICATE KEY-----

-----END CERTIFICATE KEY-----
           

雖然PEM格式的檔案通常以.pem結束,但是也可以使用 ".cer" 或者 ".crt" 表示一個證書,使用".key"表示是一個密鑰。

另外, 一個PEM檔案中可以包含多個内容,比如對于證書來說,通常來說可能需要一些額外的資訊比如證書鍊,這樣一個證書鍊可以存儲在一個PEM檔案中。

PKCS7

PKCS7是Public-Key Cryptography Standards系列的一員,主要用來存儲簽名或者加密後的資料,比如證書或者CRL。PKCS7可以用原始的DER格式進行存儲,也可以使用PEM格式進行存儲。

如果以PEM格式進行存儲,那麼檔案的開頭和結尾分别是:

‑‑‑‑‑BEGIN PKCS7‑‑‑‑‑

‑‑‑‑‑END PKCS7‑‑‑‑‑
           

在windows中PKCS7通常以.p7b結尾。

PKCS7的操作可以通過openssl指令來進行。

比如将一個PKCS7的檔案從PEM格式轉換成為DER格式:

openssl pkcs7 -in file.pem -outform DER -out file.der
           

從一個檔案中提取出所有的證書到另外一個檔案:

openssl pkcs7 -in file.pem -print_certs -out certs.pem
           

PKCS8

PKCS8也是Public-Key Cryptography Standards系列的一員,它主要用來存儲私鑰。

私鑰首先會使用PKCS #5的标準進行加密,然後将其進行base64編碼,轉換成為PEM格式進行存儲。

是以說PKCS8的格式就是PEM,但是裡面存儲的内容是經過加密過後的私鑰。

PKCS12

PKCS12也是Public-Key Cryptography Standards系列的一員,PKCS12可以看做是PKCS7的擴充,在PKCS12中可以存儲證書,私鑰或者CRL。和PKCS7相比,PKCS12可以額外存儲私鑰。

PKCS12的檔案是以.p12 或者 .pfx結尾的。在JDK9中,PKCS12是預設的密鑰存儲格式。

PKCS12的格式和PEM相比會複雜的多,在需要的時候,我們可以使用OPENSSL将PKCS12格式轉換成為PEM格式:

openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
           

當然也可以從PEM到PKCS12:

openssl pkcs12 -export -in Cert.pem -out Cert.p12 -inkey key.pem
           

總結

以上就是PEM和PKCS系列中幾個非常常用的編碼格式。希望大家能夠掌握和正确使用。