密碼學系列之:PEM和PKCS7,PKCS8,PKCS12

簡介

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系列中幾個非常常用的編碼格式。希望大家能夠掌握和正確使用。

更多內容請參考 //www.flydean.com/48-pem-pkcs7812/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!