聲明:建議結合Openssl源代碼學習;
一、基礎知識
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協議
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作為基礎設施的重要標志,實際上就是網絡社會的一次“社會分工”,這種分工可能會成為網絡應用發展史上的重要里程碑。
二、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中;
三、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;
原文鏈接:https://www.cnblogs.com/testlife007/p/6888340.html