1、X.509標准
x509是由國際電信聯盟(ITU-T)制定的數字證書標准;包含公鑰和用戶標志符、CA等;
x509是數字證書的規范,P7和P12是兩種封裝形式;X.509是常見通用的證書格式。所有的證書都符合為Public key Infrastructure 制定的ITU-T x509國際標准。
PKCS # 7常用的后綴是: P7B, P7C, SPC
PKCS # 12常用的后綴有: P12 ,PFX
X.509 DER編碼(ASCII)的后綴是: DER CER CRT
X.509PEM編碼(base64)的后綴是:PEM CER CRT
pem格式是經過base64編碼的證書,der格式是DER編碼的證書;
證書入和導出操作支持四種文件格式。
- 個人信息交換 (PKCS #12)
個人信息交換格式(PFX,也稱為 PKCS #12)支持安全存儲證書、私鑰和證書路徑中的所有證書。PKCS #12 是唯一可用於導出證書及其私鑰的文件格式。 - 加密消息語法標准 (PKCS #7)
PKCS #7 格式支持存儲證書和證書路徑中的所有證書 - DER 編碼的二進制 X.509
區別編碼規則 (DER) 格式支持存儲單個證書。該格式不支持存儲私鑰或證書路徑。 - Base64 編碼的 X.509
Base64 格式支持存儲單個證書。該格式不支持存儲私鑰或證書路徑。
cer/crt證書: 用於存儲公鑰證書的文件格式,它是二進制存放的,不含私鑰,不能導入到個人存儲區,因為個人存儲區存儲與私鑰相關的數字證書;cer、crt格式只是一個后綴,該后綴的證書可以pem編碼的也可以是der編碼的;
pfx/p12證書:含有證書和對應的 私鑰,可以導入IE的個人證書存儲區;
p12格式的證書一般用於證書的分發,里面包含了證書和對應的私鑰;
由於Apache Proxy是PEM格式Prefer的,不支持DER經編碼的證書,因此,要通過證書的編碼轉換,把DER編碼轉換為PEM編碼,再經Apache處理。
證書的編碼為DER編碼,但DER編碼的文件是二進制格式不利於讀寫和傳播,所以對DER編碼的數據進行BASE64編碼形成了PEM。
2、PKCS系列標准
由RSA數字安全公司但呢個制定的公鑰密碼學標准,包含證書申請、更新、CRL、DS等;
其中PKCS7,定義了通用的消息語法,含數字簽名和加密,與PEM兼容,互相轉化;
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
比較:
P7一般是把證書分成兩個文件,一個公鑰一個私鑰,有PEM和DER兩種編碼方式。PEM比較多見,就是純文本的,P7一般是分發公鑰用,看到的就是一串可見字符串,擴展名經常是.crt,.cer,.key等。DER是二進制編碼。
P12是把證書壓成一個文件,.pfx 。主要是考慮分發證書,私鑰是要絕對保密的,不能隨便以文本方式散播。所以P7格式不適合分發。.pfx中可以加密碼保護,所以相對安全些。
在實踐中要中,用戶證書都是放在USB Key中分發,服務器證書經常還是以文件方式分發。服務器證書和用戶證書,都是X509證書,就是里面的屬性有區別。
3、Openssl源碼分析
1.簡介
開源SSL安全工具,包含SSL協議實現,大量軟算法(對稱/非對稱/摘要),非對稱算法密鑰生成,ASN.1編解碼庫、證書請求(pscs10) 編解碼,數字證書、CRL編解碼,OCSP協議,pkcs7標准實現和pkcs12個人數字證書格式實現等功能;
使用C語言開發,跨平台優越;
2.源碼框架
主要由eay基礎函數庫、ssl庫、工具、demo和test組成;
Eay庫源碼,在crypto目錄下,包含:
1) asn.1 DER編碼解碼(crypto/asn.1目錄),包含數字證書請求,CRL吊銷列表及pkcs8編解碼函數;
2) 抽象IO(BIO,crypto/bio目錄),包含各種輸入輸出抽象,文件、內存、stdio、socket、SSL;
3) 大數運算(crypto/bn目錄),用於非對稱算法密鑰生成和各種加解密;
4) 字符緩存(crypto/buffer目錄);
5) 配置文件讀取(crypto/conf 目錄),主要配置文件為openssl.cnf。本目錄實現改格式配置文件的讀取;
6) DSO動態共享對象(crypto/dso目錄),抽象各平台動態庫加載函數,提供統一接口;
7) 硬件引擎(crypto/engine目錄),提供了規定接口;
8) 錯誤處理(cryto/err目錄),提供處理接口;以堆棧顯示錯誤;
9) 對稱算法、非對稱算法及摘要算法封裝(crypto/evp目錄)
10) HMAC(crypto/hmac目錄),實現基於對稱算法的MAC;
11) Hash表(crypto/lhash目錄),實現散列表數據結構;
12) OCSP數字證書在線認證(crypto/ocsp目錄),實現ocsp協議的編解碼等;
13) PEM文件格式處理(crypto/pem目錄),生成和讀取PEM文件;
14) Pkcs7消息語法(crypto/pkcs7目錄),實現構造和解析PKCS7消息;
15) Pkcs12個人證書格式(crypto/pkcs12目錄),實現pkcs12證書構造和解析;
16) 隊列(crypto/pqueue目錄),實現隊列數據結構,用於DTLS;
17) 隨機數(crypto/rand目錄),實現偽隨機數生成,支持用戶自定義;
18) 堆棧(crypto/rand目錄),實現堆棧數據結構;
19) 線程支持(crypto/threads),openssl支持多線程,但是用戶必須實現相關接口;
20) 文本數據庫(crypto/txt_db目錄);
21) X509數字證書(crypto/x509目錄),包括數字證書申請、證書和CRL構造解析和簽名驗證;
22) 對稱算法(crypto/aes、crypto/bf、crypto/cast、crypto/omp和crypto/des等);
23) 非對稱算法(crypto/dh、crypto/dsa、crytpo/ec和crypto/ecdh);
24) 摘要算法(crypto/md2/4/5/sha)以及密鑰交換/認證算法(crypto/dh和crypto/krb5);
SSL庫源代碼在ssl目錄下,包含sslv2,sslv3,tlsv1和DTLS的源碼;包含客戶端源碼、服務器源碼、通用、底層包、方法以及協議相關密鑰計算源碼;
工具源碼在crypto/apps目錄;demo中有硬件引擎engines源碼;測試源碼在test中;
摘自:https://www.cnblogs.com/testlife007/p/6699566.html
更多源碼分析可參考:《Openssl編程》