Openssl源代碼整理學習---含P7/P10/P12說明

聲明:建議結合Openssl源代碼學習;html

1、基礎知識算法

1.Openssl 簡史數據庫

OpenSSL項目是加拿大人Eric A.Yang 和Tim J.Hudson開發,如今有Openssl項目小組負責改進和維護;他們是全球一些技術精湛的志願技術人員,他們的勞動是無償的,在此咱們應該向他們表示崇高的敬意。編程

Openssl 最先的版本在1995年發佈,1998年開始由Openssl項目組維護;緩存

當前最新版本爲OpenSSL 1.0.1;開放源代碼的SSL產品實現,採用C語言開發;源代碼能夠在www.openssl.org自由下載;安全

The OpenSSL Project is a collaborative effort to develop a robust, commercial-grade, full-featured, and Open Source toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols as well as a full-strength general purpose cryptography library. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the OpenSSL toolkit and its related documentation. 服務器

OpenSSL is based on the excellent SSLeay library developed by Eric A. Young and Tim J. Hudson. The OpenSSL toolkit is licensed under an Apache-style licence, which basically means that you are free to get and use it for commercial and non-commercial purposes subject to some simple license conditions.網絡

2.SSL協議和TLS協議session

SSL是Netscape開發的專門用戶保護Web通信的,目前版本爲3.0。最新版本的TLS 1.0是IETF(工程任務組)制定的一種新的協議,它創建在SSL 3.0協議規範之上,是SSL 3.0的後續版本。二者差異極小,能夠理解爲SSL 3.1,它是寫入了RFC的。數據結構

但在TLS與SSL3.0之間仍是存在着差異,主要是它們所支持的加密算法不一樣,因此TLS與SSL3.0不能互操做。TLS 在SSL v3.0 的基礎上,提供瞭如下加強內容:

1)更安全的MAC算法;

2)更嚴密的警報;

3)「灰色區域」規範的更明確的定義;

3.對稱算法

加解密使用同一個密鑰;主要模式有ECB,CBC,CFB,OFB等;

4.摘要算法

特殊格式輸出算法,不管輸入多長,輸出密文都是固定長度的;摘要過程不可逆;

經常使用算法有MD5(16bytes),SHA1(20bytes);

5.公鑰算法

加解密使用不一樣密鑰;密鑰不須要交換,便可通訊;加密算法和密鑰(公鑰)是公開的;

經常使用公鑰算法有RSA,DSA,DH和ECC;

6.回調函數

定義在數據結構中,是一個函數指針,方便用戶自行編寫函數,相似虛函數;

7.X.509(1993)

由國際電信聯盟(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。

 

8.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證書,就是裏面的屬性有區別。

 

7.OCSP在線證書狀態協議

由IETF頒佈,用於檢查數字證書在某一交易時刻是否有效的標準;提供快捷狀態查詢通道;

8.LDAP輕量級目錄訪問協議

簡化了X.500目錄訪問協議,普遍應用於證書發佈、CRL信息發佈、CA政策等;

 

9.PKI(Public Key Infrastructure )

PKI,"公鑰基礎設施";X.509標準中,將PKI定義爲支持公開密鑰管理並能支持認證、加密、完整性和可追究性服務的基礎設施;

更多:

完整的PKI系統必須具備權威認證機構(CA)、數字證書庫、密鑰備份及恢復系統、證書做廢系統、應用接口(API)等基本構成部分,構建PKI也將圍繞着這五大系統來着手構建。 核心技術就圍繞着數字證書的申請、頒發、使用與撤銷等整個生命週期進行展開;PKI採用數字證書方式進行服務,即經過第三方頒發的數字證書證實末端實體的密鑰,而不是在線查詢或在線分發;

PKI與應用的分離也是PKI做爲基礎設施的重要標誌,實際上就是網絡社會的一次「社會分工」,這種分工可能會成爲網絡應用發展史上的重要里程碑。

 

2、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中;

 

3、Openssl具體模塊舉例

1.PEM格式

使用PEM(Privacy Enhanced Mail),來存放各類信息,是openssl默認信息存放方式;

文件包含信息:內容類型、頭信息(加密算法和初始化變量iv)、信息體(BASE64編碼的)三部分;

PEM格式文件生成過程:

1)將個數據DER編碼;若有須要,進行加密處理;

2)根據是否加密,構造PEM頭,將1中數據進行BASE64編碼,放入PEM文件;

文件內容舉例以下圖:

編程相關:

PEM模塊實現位於/crypto/pem目錄下,依賴ASN1模塊,支持格式見/crypto/pem/pem.h文件;函數定義主要是read和write,見crypto/pem/pem.h;

 

 

2.通用數據結構

主要用於數字證書申請,數字證書和CRL中;

借ASN1庫實現DER編解碼;包含set和get操做;

 

編程相關:數據結構定義放在crypto/x509/x509.h中。

 

3.證書申請

生成x509數字證書前,用戶先提交證書申請文件,而後CA來簽發證書;

過程大體:

1)用戶生成本身公私鑰對;構造證書申請文件,符合PKCS10標準;包含用戶信息、

公鑰等,並用私鑰簽名(即自簽名證書);

2)用戶將證書申請提交給CA;

3)CA驗證簽名,提取用戶信息,並加入如頒發者信息等,用CA私鑰簽發;

編程相關:

X509證書申請數據結構定義在crypto/x509.h中,包含兩部分,X509_REQ_INFO和

X509_REQ。

 

4.X509數字證書

將用戶身份與公鑰綁定的載體,符合x509格式,必須有CA的簽名;用戶不只有數字證書,

還有對應的私鑰;

數字證書包含內容有,版本、序列號、算法、頒佈着、有效時間、共要信息、ID等;

編程相關:

源碼在crypto/x509和crypto/x509v3中,實現告終構設置、證書驗證摘要、公鑰導入導出等;

 

 

 

5.CRL

證書吊銷列表(Certificate Revocation List),是包含吊銷列表的數據結構;是離線的證書狀態信息,相似黑名單;分徹底CRL和增量CRL;

基本CRL信息有,吊銷證書序列號、時間、緣由、CRL簽名等;

數據結構在cry pto/x509/x509.h中;

編程相關:

 

 

6.PKCS7

加密消息語法(pkcs7),是各類消息存放的格式標準;如數據,簽名、數字信封、摘要和加密數據;實如今crypto/pkcs7中;

編程相關:

 

7.PKCS12

我的數字證書標準PKCS12,用於存放證書、CRL、用戶私鑰以及證書鏈;其中私鑰是加密存放的;實如今crypto/pkcs12目錄;

編程相關:

代碼結構以下,

 

數據結構定義在crpto/pkcs12/pkcs12.h中;

 

 

 

7.SSL實現

由netscape公司提出,有sslv2和sslv3,當前造成標準有tls協議和DTLS;保證通訊信道安全,提供數據加密、身份驗證以及消息完整性保護;另支持數據壓縮;經過握手協商各類算法和密鑰;

源碼在ssl目錄,有客戶端(xx_clnt.c)、服務器(xx_srvr.c)、加密實現(xx_enc.c)、記錄協議實現(xx_pkt.c)、METHOD方法(xx_meth.c)、雙方握手方法(xx_both.c),以及對外函數(xx_lib.c)

創建SSL測試環境:

1)創建本身的CA;apps中運行腳本:./CA.sh -newca,生成demoCA目錄,含ca證書和私鑰;

2)生成客戶端和服務器端證書申請;

#客戶端的

Openssl> req -newkey rsa:1024 -out req1.pem -keyout sslclientkey.pem

 

 

#服務器端

>req -newkey rsa:1024 -out req2.pem  -keyout  sslserverkey.pem  

 

 

3)簽發客戶端和服務器端證書;

>ca -in req1.pem -out sslclientcert.pem

 

#CA的簽發,必須在apps目錄下進行;

$ cd /dzrSSL/apps

> ca  -in demoCA/mySSLtest/req2.pem -out demoCA/mySSLtest/sslservercert.pem.

 

4)運行ssl服務器和客戶端;

Openssl>s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3

>s_client -ssl3 -CAfile demoCA/cacert.pem

 

5)驗證客戶端證書

6)制定加密套件

7)制定私鑰加密口

 

編程相關:

主要數據結構在ssl.h中,有SSL_CTX、SSL和SSL_SESSION;

SSL_CTX數據結構用於SSL握手前準備,設置CA文件和目錄、設置SSL握手中的證書文件和私鑰、設置協議版本等;SSL結構主要用於SSL握手以及傳送數據;SSL_SESSION保存主密鑰、session id/讀寫加解密鑰、讀寫MAC密鑰信息;

SSL_CTX緩存了全部SSL_SESSION信息,SSL包含SSL_CTX數據;經過SSL數據查找session id,實現SESSION重用;

加密套件,用openssl>ciphers命令查詢;

 

參考

1.《SSL協議及OPENSSL源代碼分析》,陳巖文檔,2009;

2.《Openssl編程》,江南計算技術研究所,趙春平,forxy@126,;

3.《OpenSSL與網絡信息安全——基礎、結構和指令》,王志海,2004;

4.《Network Sercurity with OpenSSL》,Pravir Chandra,MattMessier,John Viega,2002;

相關文章
相關標籤/搜索