證書相關知識

衡子發表於2015-12-18

 

PKI 常見的數字證照格式:

cer字尾的證照檔案有兩種編碼-->DER二進位制編碼或者BASE64編碼(也就是.pem)

p7b一般是證照鏈,裡面包括1到多個證照
pfx
是指以pkcs#12格式儲存的證照和相應私鑰。

Security程式設計中,有幾種典型的密碼交換資訊檔案格式:
DER-encoded certificate: .cer, .crt
PEM-encoded message: .pem
PKCS#12 Personal Information Exchange: .pfx, .p12
PKCS#10 Certification Request: .p10
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b

.cer/.crt是用於存放證照,它是2進位制形式存放的,不含私鑰。
.pem
crt/cer的區別是它以Ascii來表示。
pfx/p12
用於存放個人證照/私鑰,他通常包含保護密碼,2進位制方式
p10
是證照請求
p7r
CA對證照請求的回覆,只用於匯入
p7b
以樹狀展示證照鏈(certificate chain),同時也支援單個證照,不含私鑰。

其中,我介紹如何從p12/pfx檔案中提取金鑰對及其長度:
1
,首先,讀取pfx/p12檔案(需要提供保護密碼)
2
,通過別名(Alias,注意,所有證照中的資訊項都是通過Alias來提取的)提取你想要分析的證照鏈
3
,再將其轉換為一個以X509證照結構體
4
,提取裡面的項,如果那你的證照項放在第一位(單一證照),直接讀取 x509Certs[0](見下面的程式碼)這個X509Certificate物件
5
X509Certificate物件有很多方法,tain198127網友希望讀取RSA金鑰(公私鑰)及其長度(見http://www.matrix.org.cn/thread.shtml?topicId=43786&forumId=55&#reply),那真是太Easy了,
            X509Certificate keyPairCert = x509Certs[0];
            int iKeySize = X509CertUtil.getCertificateKeyLength(keyPairCert);
            System.out.println("
證照金鑰演算法="+keyPairCert.getPublicKey().getAlgorithm());
            System.out.println("
證照金鑰長度="+iKeySize);
提取了他所需要的資訊。

   

X.509定義了兩種證照:公鑰證照和屬性證照  
  PKCS#7
PKCS#12使用的都是公鑰證照  
  PKCS
7SignedData的一種退化形式可以分發公鑰證照和CRL  
 
一個SignedData可以包含多張公鑰證照  
  PKCS
12可以包含公鑰證照及其私鑰,也可包含整個證照鏈  

   

簡介
Java
自帶的keytool工具是個金鑰和證照管理工具。它使使用者能夠管理自己的公鑰/私鑰對及相關證照,用於(通過數字簽名)自我認證(使用者向別的使用者/服務認證自己)或資料完整性以及認證服務。它還允許使用者儲存他們的通訊對等者的公鑰(以證照形式)。

keytool 將金鑰和證照儲存在一個所謂的金鑰倉庫(keystore)中。預設的金鑰倉庫實現將金鑰倉庫實現為一個檔案。它用口令來保護私鑰。

Java KeyStore的型別
JKS
JCEKSJava金鑰庫(KeyStore)的兩種比較常見型別(我所知道的共有5種,JKS, JCEKS, PKCS12, BKSUBER)

JKSProviderSUN,在每個版本的JDK中都有,JCEKSProviderSUNJCE1.4後我們都能夠直接使用它。

JCEKS在安全級別上要比JKS強,使用的ProviderJCEKS(推薦),尤其在保護KeyStore中的私鑰上(使用TripleDes)。

PKCS#12是公鑰加密標準,它規定了可包含所有私鑰、公鑰和證照。其以二進位制格式儲存,也稱為 PFX 檔案,在windows中可以直接匯入到金鑰區,注意,PKCS#12的金鑰庫保護密碼同時也用於保護Key

BKS 來自BouncyCastle Provider,它使用的也是TripleDES來保護金鑰庫中的Key,它能夠防止證照庫被不小心修改(Keystorekeyentry改掉1 bit都會產生錯誤),BKS能夠跟JKS互操作,讀者可以用KeytoolTryTry

UBER比較特別,當密碼是通過命令列提供的時候,它只能跟keytool互動。整個keystore是通過PBE/SHA1/Twofish加密,因此keystore能夠防止被誤改、察看以及校驗。以前,Sun JDK(提供者為SUN)允許你在不提供密碼的情況下直接載入一個Keystore,類似cacertsUBER不允許這種情況。

   

證照匯入
Der/Cer
證照匯入:

要從某個檔案中匯入某個證照,使用keytool工具的-import命令:

keytool -import -file mycert.der -keystore mykeystore.jks

如果在 -keystore 選項中指定了一個並不存在的金鑰倉庫,則該金鑰倉庫將被建立。

如果不指定 -keystore 選項,則預設金鑰倉庫將是宿主目錄中名為 .keystore 的檔案。如果該檔案並不存在,則它將被建立。

建立金鑰倉庫時會要求輸入訪問口令,以後需要使用此口令來訪問。可使用-list命令來檢視金鑰倉庫裡的內容:

keytool -list -rfc -keystore mykeystore.jks

   


P12
格式證照匯入:

keytool無法直接匯入PKCS12檔案。

第一種方法是使用IEpfx證照匯入,再匯出為cert格式檔案。使用上面介紹的方法將其匯入到金鑰倉庫中。這樣的話倉庫裡面只包含了證照資訊,沒有私鑰內容。


第二種方法是將pfx檔案匯入到IE瀏覽器中,再匯出為pfx檔案。
      
新生成的pfx不能被匯入到keystore中,報錯:keytool錯誤: java.lang.Exception: 所輸入的不是一個 X.509 認證。新生成的pfx檔案可以被當作keystore使用。但會報個錯誤as unknown attr1.3.6.1.4.1.311.17.1,查了下資料,IE匯出的就會這樣,使用Netscape就不會有這個錯誤.

第三種方法是將pfx檔案當作一個keystore使用。但是通過微軟的證照管理控制檯生成的pfx檔案不能直接使用。keytool不認此格式,報keytool錯誤: java.io.IOException: failed to decrypt safe contents entry。需要通過OpenSSL轉換一下:

1openssl pkcs12 -in mycerts.pfx -out mycerts.pem

2openssl pkcs12 -export -in mycerts.pem -out mykeystore.p12

通過keytool-list命令可檢查下金鑰倉庫中的內容:

keytool -rfc -list -keystore mykeystore.p12 -storetype pkcs12

這裡需要指明倉庫型別為pkcs12,因為預設的型別為jks。這樣此金鑰倉庫就即包含證照資訊也包含私鑰資訊。

P7B格式證照匯入:

keytool無法直接匯入p7b檔案。

需要將證照鏈RootServer.p7b(包含根證照)匯出為根rootca.cer和子rootcaserver.cer

將這兩個證照匯入到可信任的金鑰倉庫中。

keytool -import -alias rootca -trustcacerts -file rootca.cer -keystore testkeytrust.jks

遇到是否信任該證照提示時,輸入y

keytool -import -alias rootcaserver -trustcacerts -file rootcaserver.cer -keystore testkeytrust.jks

 
總結:

1)P12格式的證照是不能使用keytool工具匯入到keystore中的

2)The Sun's PKCS12 Keystore對從IE和其他的windows程式生成的pfx格式的證照支援不太好.

3)P7B證照鏈不能直接匯入到keystore,需要將裡面的證照匯出成cer格式,再分別匯入到keystore

 

openssl數字證照常見格式與協議介紹:

證照主要的檔案型別和協議有: PEMDERPFXJKSKDBCERKEYCSRCRTCRLOCSPSCEP等。

PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式來存放各種資訊,它是 openssl 預設採用的資訊存放方式。Openssl 中的 PEM 檔案一般包含如下資訊:

  1. 內容型別:表明本檔案存放的是什麼資訊內容,它的形式為"——-BEGIN XXXX ——",與結尾的"——END XXXX——"對應。
  2. 頭資訊:表明資料是如果被處理後存放,openssl 中用的最多的是加密資訊,比如加密演算法以及初始化向量 iv
  3. 資訊體: BASE64 編碼的資料。可以包括所有私鑰(RSA DSA)、公鑰(RSA DSA)和 (x509) 證照。它儲存用 Base64 編碼的 DER 格式資料,用 ascii 報頭包圍,因此適合系統之間的文字模式傳輸。

    使用PEM格式儲存的證照:
    —–BEGIN CERTIFICATE—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END CERTIFICATE—–
    使用PEM格式儲存的私鑰:
    —–BEGIN RSA PRIVATE KEY—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END RSA PRIVATE KEY—–
    使用PEM格式儲存的證照請求檔案:
    —–BEGIN CERTIFICATE REQUEST—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END CERTIFICATE REQUEST—–

DER辨別編碼規則 (DER) 可包含所有私鑰、公鑰和證照。它是大多數瀏覽器的預設格式,並按 ASN1 DER 格式儲存。它是無報頭的 PEM 是用文字報頭包圍的 DER
PFX
P12公鑰加密標準 #12 (PKCS#12) 可包含所有私鑰、公鑰和證照。其以二進位制格式儲存,也稱為 PFX 檔案。通常可以將Apache/OpenSSL使用的"KEY檔案 + CRT檔案"格式合併轉換為標準的PFX檔案,你可以將PFX檔案格式匯入到微軟IIS 5/6、微軟ISA、微軟Exchange Server等軟體。轉換時需要輸入PFX檔案的加密密碼。
JKS
通常可以將Apache/OpenSSL使用的"KEY檔案 + CRT檔案"格式"轉換為標準的Java Key Store(JKS)檔案。JKS檔案格式被廣泛的應用在基於JAVAWEB伺服器、應用伺服器、中介軟體。你可以將JKS檔案匯入到TOMCAT WEBLOGIC 等軟體。
KDB
通常可以將Apache/OpenSSL使用的"KEY檔案 + CRT檔案"格式轉換為標準的IBM KDB檔案。KDB檔案格式被廣泛的應用在IBMWEB伺服器、應用伺服器、中介軟體。你可以將KDB檔案匯入到IBM HTTP ServerIBM Websphere 等軟體。
CSR
證照請求檔案(Certificate Signing Request)。生成 X509 數字證照前,一般先由使用者提交證照申請檔案,然後由 CA 來簽發證照。大致過程如下(X509 證照申請的格式標準為 pkcs#10 rfc2314):

  1. 使用者生成自己的公私鑰對;
  2. 構造自己的證照申請檔案,符合 PKCS#10 標準。該檔案主要包括了使用者資訊、公鑰以及一些可選的屬性資訊,並用自己的私鑰給該內容簽名;
  3. 使用者將證照申請檔案提交給 CA;
  4. CA 驗證簽名,提取使用者資訊,並加上其他資訊(比如頒發者等資訊), CA 的私鑰簽發數字證照;
  5. 說明:數字證照(x.509)是將使用者(或其他實體)身份與公鑰繫結的資訊載體。一個合法的數字證照不僅要符合 X509 格式規範,還必須有 CA 的簽名。使用者不僅有自己的數字證照,還必須有對應的私鑰。X509v3 數字證照主要包含的內容有:證照版本、證照序列號、簽名演算法、頒發者資訊、有效時間、持有者資訊、公鑰資訊、頒發者 ID、持有者 ID 和擴充套件項。

OCSP線上證照狀態協議(OCSP,Online Certificate Status Protocol,rfc2560)用於實時表明證照狀態。OCSP 客戶端通過查詢 OCSP 服務來確定一個證照的狀態,可以提供給使用者一個或多個數字證照的有效性資料,它建立一個可實時響應的機制,讓使用者可以實時確認每一張證照的有效性,解決由CRL引發的安全問題。。OCSP 可以通過 HTTP協議來實現。rfc2560 定義了 OCSP 客戶端和服務端的訊息格式。
CER 
一般指使用DER格式的證照。
CRT
證照檔案。可以是PEM格式。
KEY  
一般指PEM格式的私鑰檔案。
CRL
證照吊銷列表 (Certification Revocation List) 是一種包含撤銷的證照列表的簽名資料結構。CRL 是證照撤銷狀態的公佈形式,CRL 就像信用卡的黑名單,用於公佈某些數字證照不再有效。CRL 是一種離線的證照狀態資訊。它以一定的週期進行更新。CRL 可以分為完全 CRL和增量 CRL。在完全 CRL 中包含了所有的被撤銷證照資訊,增量 CRL 由一系列的 CRL 來表明被撤銷的證照資訊,它每次釋出的 CRL 是對前面釋出 CRL 的增量擴充。基本的 CRL 資訊有:被撤銷證照序列號、撤銷時間、撤銷原因、簽名者以及 CRL 簽名等資訊。基於 CRL 的驗證是一種不嚴格的證照認證。CRL 能證明在 CRL 中被撤銷的證照是無效的。但是,它不能給出不在 CRL 中的證照的狀態。如果執行嚴格的認證,需要採用線上方式進行認證, OCSP 認證。一般是由CA簽名的一組電子文件,包括了被廢除證照的唯一標識(證照序列號),CRL用來列出已經過期或廢除的數字證照。它每隔一段時間就會更新,因此必須定期下載該清單,才會取得最新資訊。
SCEP
簡單證照註冊協議。基於檔案的證照登記方式需要從您的本地計算機將文字檔案複製和貼上到證照釋出中心,和從證照釋出中心複製和貼上到您的本地計算機。 SCEP可以自動處理這個過程但是CRLs仍然需要手工的在本地計算機和CA釋出中心之間進行復制和貼上。
PKCS7
加密訊息語法(pkcs7),是各種訊息存放的格式標準。這些訊息包括:資料、簽名資料、數字信封、簽名數字信封、摘要資料和加密資料。
PKCS12 – pkcs12 (
個人數字證照標準)用於存放使用者證照、crl、使用者私鑰以及證照鏈。pkcs12 中的私鑰是加密存放的。

證照格式以及相互轉換:

PKCS 全稱是 Public-Key Cryptography Standards ,是由 RSA 實驗室與其它安全系統開發商為促進公鑰密碼的發展而制訂的一系列標準,PKCS 目前共釋出過 15 個標準。常用的有:
PKCS#7 Cryptographic Message Syntax Standard
PKCS#10 Certification Request Standard
PKCS#12 Personal Information Exchange Syntax Standard

X.509是常見通用的證照格式。所有的證照都符合為Public Key Infrastructure (PKI) 制定的 ITU-T X509 國際標準。
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),同時也支援單個證照,不含私鑰。
—————-
[
]
der,cer
檔案一般是二進位制格式的,只放證照,不含私鑰
crt
檔案可能是二進位制的,也可能是文字格式的,應該以文字格式居多,功能同der/cer
pem
檔案一般是文字格式的,可以放證照或者私鑰,或者兩者都有
pem
如果只含私鑰的話,一般用.key副檔名,而且可以有密碼保護
pfx,p12
檔案是二進位制格式,同時含私鑰和證照,通常有保護密碼
怎麼判斷是文字格式還是二進位制?用記事本開啟,如果是規則的數字字母,如
—–BEGIN CERTIFICATE—–
MIIE9jCCA96gAwIBAgIQVXD9d9wgivhJM//a3VIcDjANBgkqhkiG9w0BAQUFADBy
—–END CERTIFICATE—–
就是文字的,上面的BEGIN CERTIFICATE,說明這是一個證照
如果是—–BEGIN RSA PRIVATE KEY—–,說明這是一個私鑰
文字格式的私鑰,也可能有密碼保護
文字格式怎麼變成二進位制?從程式角度來說,去掉前後的—-行,剩下的去掉回車,用base64解碼,就得到二進位制了
不過一般都用命令列openssl完成這個工作
—————
openssl建立CA證照的RSA金鑰(PEM格式)
openssl genrsa -des3 -out ca.key 1024

二用openssl建立CA證照(PEM格式,假如有效期為一年)
openssl req -new -x509 -days 365 -key ca.key -out ca.crt -config openssl.cnf
openssl
是可以生成DER格式的CA證照的,最好用IEPEM格式的CA證照轉換成DER格式的CA證照。

x509pfx
pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx

PEM格式的ca.key轉換為Microsoft可以識別的pvk格式。
pvk -in ca.key -out ca.pvk -nocrypt -topvk
PKCS#12 PEM 的轉換
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
驗證 openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
PFX 格式檔案中提取私鑰格式檔案 (.key)
openssl pkcs12 -in mycert.pfx -nocerts -nodes -out mycert.key
轉換 pem 到到 spc
openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
-outform -inform 指定 DER 還是 PAM 格式。例如:
openssl x509 -in Cert.pem -inform PEM -out cert.der -outform DER
PEM PKCS#12 的轉換,
openssl pkcs12 -export -in Cert.pem -out Cert.p12 -inkey key.pem

轉自:http://blog.csdn.net/anxuegang/article/details/6157927

http://blog.csdn.net/xiaxiaorui2003/archive/2009/01/12/3758183.aspx

http://blog.csdn.net/anxuegang/article/details/6157928