之前沒接觸過證書加密的話,對證書相關的這些概念真是感覺挺棘手的,因為一下子來了一大堆新名詞,看起來像是另一個領域的東西,而不是我們所熟悉的程式設計領域的那些東西,起碼我個人感覺如此,且很長時間都沒怎麼搞懂。寫這篇文章的目的就是為了理理清這些概念,搞清楚它們的含義及關聯,還有一些基本操作。

PKCS 全稱是 Public-Key Cryptography Standards ,是由 RSA 實驗室與其它安全系統開發商為促進公鑰密碼的發展而制訂的一系列標準,PKCS 目前共釋出過 15 個標準:

(1)PKCS#1:RSA加密標準。PKCS#1定義了RSA公鑰函式的基本格式標準,特別是數字簽名。它定義了數字簽名如何計算,包括待簽名資料和簽名本身的格式;它也定義了PSA公/私鑰的語法。

(2)PKCS#2:涉及了RSA的訊息摘要加密,這已被併入PKCS#1中。

(3)PKCS#3:Diffie-Hellman金鑰協議標準。PKCS#3描述了一種實現Diffie- Hellman金鑰協議的方法。

(4)PKCS#4:最初是規定RSA金鑰語法的,現已經被包含進PKCS#1中。

(5)PKCS#5:基於口令的加密標準。PKCS#5描述了使用由口令生成的金鑰來加密8位位組串併產生一個加密的8位位組串的方法。PKCS#5可以用於加密私鑰,以便於金鑰的安全傳輸(這在PKCS#8中描述)。

(6)PKCS#6:擴充套件證書語法標準。PKCS#6定義了提供附加實體資訊的X.509證書屬性擴充套件的語法(當PKCS#6第一次釋出時,X.509還不支援擴充套件。這些擴充套件因此被包括在X.509中)。

(7)PKCS#7:密碼訊息語法標準。PKCS#7為使用密碼演算法的資料規定了通用語法,比如數字簽名和數字信封。PKCS#7提供了許多格式選項,包括未加密或簽名的格式化訊息、已封裝(加密)訊息、已簽名訊息和既經過簽名又經過加密的訊息。

(8)PKCS#8:私鑰資訊語法標準。PKCS#8定義了私鑰資訊語法和加密私鑰語法,其中私鑰加密使用了PKCS#5標準。

(9)PKCS#9:可選屬性型別。PKCS#9定義了PKCS#6擴充套件證書、PKCS#7數字簽名訊息、PKCS#8私鑰資訊和PKCS#10證書籤名請求中要用到的可選屬性型別。已定義的證書屬性包括E-mail地址、無格式姓名、內容型別、訊息摘要、簽名時間、簽名副本(counter signature)、質詢口令字和擴充套件證書屬性。

(10)PKCS#10:證書請求語法標準。PKCS#10定義了證書請求的語法。證書請求包含了一個唯一識別名、公鑰和可選的一組屬性,它們一起被請求證書的實體簽名(證書管理協議中的PKIX證書請求訊息就是一個PKCS#10)。

(11)PKCS#11:密碼令牌介面標準。PKCS#11或“Cryptoki”為擁有密碼資訊(如加密金鑰和證書)和執行密碼學函式的單使用者裝置定義了一個應用程式介面(API)。智慧卡就是實現Cryptoki的典型裝置。注意:Cryptoki定義了密碼函式介面,但並未指明裝置具體如何實現這些函式。而且Cryptoki只說明瞭密碼介面,並未定義對裝置來說可能有用的其他介面,如訪問裝置的檔案系統介面。

(12)PKCS#12:個人資訊交換語法標準。PKCS#12定義了個人身份資訊(包括私鑰、證書、各種祕密和擴充套件欄位)的格式。PKCS#12有助於傳輸證書及對應的私鑰,於是使用者可以在不同裝置間移動他們的個人身份資訊。

(13)PDCS#13:橢圓曲線密碼標準。PKCS#13標準當前正在完善之中。它包括橢圓曲線引數的生成和驗證、金鑰生成和驗證、數字簽名和公鑰加密,還有金鑰協定,以及引數、金鑰和方案標識的ASN.1語法。

(14)PKCS#14:偽隨機數產生標準。PKCS#14標準當前正在完善之中。為什麼隨機數生成也需要建立自己的標準呢?PKI中用到的許多基本的密碼學函式,如金鑰生成和Diffie-Hellman共享金鑰協商,都需要使用隨機數。然而,如果“隨機數”不是隨機的,而是取自一個可預測的取值集合,那麼密碼學函式就不再是絕對安全了,因為它的取值被限於一個縮小了的值域中。因此,安全偽隨機數的生成對於PKI的安全極為關鍵。

(15)PKCS#15:密碼令牌資訊語法標準。PKCS#15通過定義令牌上儲存的密碼物件的通用格式來增進密碼令牌的互操作性。在實現PKCS#15的裝置上儲存的資料對於使用該裝置的所有應用程式來說都是一樣的,儘管實際上在內部實現時可能所用的格式不同。PKCS#15的實現扮演了翻譯家的角色,它在卡的內部格式與應用程式支援的資料格式間進行轉換。

PKCS#7 常用的字尾是: .P7B .P7C .SPC
PKCS#12 常用的字尾有: .P12 .PFX
X.509 DER 編碼(ASCII)的字尾是: .DER .CER .CRT
X.509 PAM 編碼(Base64)的字尾是: .PEM .CER .CRT
.cer/.crt是用於存放證書,它是2進位制形式存放的,不含私鑰。
.pem跟crt/cer的區別是它以Ascii來表示。
pfx/p12用於存放個人證書/私鑰,他通常包含保護密碼,2進位制方式
p10是證書請求
p7r是CA對證書請求的回覆,只用於匯入
p7b以樹狀展示證書鏈(certificate chain),同時也支援單個證書,不含私鑰。

1.證書格式

PEM 格式

PEM格式通常用於數字證書認證機構(Certificate Authorities,CA),副檔名為.pem, .crt, .cer, .key。 內容為Base64編碼的ASCII碼檔案,有類似”—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–“的頭尾標記。伺服器認證證書,中級認證證書和私鑰都可以儲存為PEM格式(認證證書其實就是公鑰)。Apache和類 似的伺服器使用PEM格式證書。

DER 格式

DER格式與PEM不同之處在於其使用二進位制而不是Base64編碼的ASCII。副檔名為.der,但也經常使用.cer用作副檔名,所有型別的認證證書和私鑰都可以儲存為DER格式。Java使其典型使用平臺。

PKCS#7/P7B 格式

PKCS#7 或 P7B格式通常以Base64的格式儲存,副檔名為.p7b 或 .p7c, 有類似BEGIN PKCS7—–” 和 “—–END PKCS7—–“的頭尾標記。PKCS#7 或 P7B只能儲存認證證書或證書路徑中的證書(就是儲存認證證書鏈,本級,上級,到根級都存到一個檔案中)。不能儲存私鑰,Windows和Tomcat都 支援這種格式。

PKCS#12/PFX 格式

PKCS#12 或 PFX格式是以加密的二進位制形式儲存伺服器認證證書,中級認證證書和私鑰。副檔名為.pfx 和 .p12,PXF通常用於Windows中匯入匯出認證證書和私鑰。

2.轉換方式

可以使用OpenSSL命令列工具在不同證書格式之間的轉換

PEM to DER

openssl x509 -outform der -in certificate.pem -out certificate.der

PEM to P7B

openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer

PEM to PFX

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

DER to PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

P7B to PEM

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

PFX to PEM

openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

PXF轉PEM後certificate.cer檔案包含認證證書和私鑰,需要把它們分開儲存才能使用。


X509

X.509是常見通用的證書格式。所有的證書都符合為Public Key Infrastructure (PKI) 制定的 ITU-T X509 國際標準。X.509是國際電信聯盟-電信(ITU-T)部分標準和國際標準化組織(ISO)的證書格式標準。作為ITU-ISO目錄服務系列標準的一部分,X.509是定義了公鑰證書結構的基本標準。1988年首次釋出,1993年和1996年兩次修訂。當前使用的版本是X.509 V3,它加入了擴充套件欄位支援,這極大地增進了證書的靈活性。X.509 V3證書包括一組按預定義順序排列的強制欄位,還有可選擴充套件欄位,即使在強制欄位中,X.509證書也允許很大的靈活性,因為它為大多數字段提供了多種編碼方案。