openssl 簡介

DayThinking發表於2012-11-22
        OpenSSL是一個基於密碼學的安全開發包,OpenSSL提供的功能相當強大和全面,囊括了主要的密碼演算法、常用的金鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程式供測試或其它目的使用。 
  1.對稱加密演算法 
       OpenSSL一共提供了8種對稱加密演算法,其中7種是分組加密演算法,僅有的一種流加密演算法是RC4。這7種分組加密演算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支援電子密碼本模式(ECB)、加密分組連結模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它演算法使用的則是64位。事實上,DES演算法裡面不僅僅是常用的DES演算法,還支援三個金鑰和兩個金鑰3DES演算法。 
  2.非對稱加密演算法 
       OpenSSL一共實現了4種非對稱加密演算法,包括DH演算法、RSA演算法、DSA演算法和橢圓曲線演算法(EC)。DH演算法一般使用者金鑰交換。RSA演算法既可以用於金鑰交換,也可以用於數字簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於資料加密。DSA演算法則一般只用於數字簽名。 
  3.資訊摘要演算法 
      OpenSSL實現了5種資訊摘要演算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA演算法事實上包括了SHA和SHA1兩種資訊摘要演算法,此外,OpenSSL還實現了DSS標準中規定的兩種資訊摘要演算法DSS和DSS1。 
  4.金鑰和證書管理 
        金鑰和證書管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支援多種標準。 
       首先,OpenSSL實現了ASN.1的證書和金鑰相關標準,提供了對證書、公鑰、私鑰、證書請求以及CRL等資料物件的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開金鑰對和對稱金鑰的方法、函式和應用程式,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標準中提供了對私鑰的加密保護功能,使得金鑰可以安全地進行儲存和分發。 
       在此基礎上,OpenSSL實現了對證書的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文字資料庫,支援證書的管理功能,包括證書金鑰產生、請求產生、證書籤發、吊銷和驗證等功能。 
  事實上,OpenSSL提供的CA應用程式就是一個小型的證書管理中心(CA),實現了證書籤發的整個流程和證書管理的大部分機制。 
  5.SSL和TLS協議 

SSL(Secure Sockets Layer 安全套接層)是一種基於Web應用的安全通訊協議,最早由Netscape(網景)公司提出。SSL介於TCP協議和應用層 協議之間,主要作用就是將HTTP、FTP等應用層的資料進行加密然後依託可靠的TCP協議在網際網路上傳輸到目的地,其中最典型的應用就是https。

SSL提供3個基本的安全服務

1)身份合法性:資料傳送方和接收方要確認彼此身份,要確保各自的身份不會被冒充。(通過數字證書實現)

2)資料機密性:所有傳輸的資料都進行加密,並且要確保即使資料被截獲也無法破解。(通過非對稱或對稱加密加密演算法實現)

3)資料完整性:確保收到的資料與傳送方發出的資料一致,沒有被篡改。(通過MAC演算法實現)

SSL協議主要採用的資料加密演算法

1)非對稱加密演算法:資料加密和解密使用不同的金鑰,如RSA公鑰加密演算法。優點是安全級別高,很難被破解;缺點是加密解密的速度慢,因此只適用於小量資料的加密。SSL協議採用非對稱加密演算法實現數字簽名,驗證資料傳送方(或接收方)的身份,同時也用非對稱加密演算法交換金鑰(用於資料加密的對稱加密演算法的金鑰,以及用於資料完整性驗證的MAC演算法)。

2)對稱加密演算法:資料加密和解密使用同一個金鑰,如DES、3DES、RC4等都是對稱加密演算法。優點是加解密速度快,適用於大資料量的加密,但安全性較差。SSL協議採用對稱加密演算法對傳輸的資料進行加密。

3)MAC演算法:Message Authentication Codes,即訊息認證碼演算法,MAC含有金鑰雜湊函式演算法,相容了MD和SHA演算法的特性,並在此基礎上加入了金鑰。SSL協議採用MAC演算法來檢驗訊息的完整性。

6.應用程式 OpenSSL的應用程式已經成為了OpenSSL重要的一個組成部分,其重要性恐怕是OpenSSL的開發者開始沒有想到的。現在OpenSSL的應用中,很多都是基於OpenSSL的應用程式而不是其API的,如OpenCA,就是完全使用OpenSSL的應用程式實現的。OpenSSL的應用程式是基於OpenSSL的密碼演算法庫和SSL協議庫寫成的,所以也是一些非常好的OpenSSL的API使用範例,讀懂所有這些範例,你對OpenSSL的API使用瞭解就比較全面了,當然,這也是一項鍛鍊你的意志力的工作。 OpenSSL的應用程式提供了相對全面的功能,在相當多的人看來,OpenSSL已經為自己做好了一切,不需要再做更多的開發工作了,所以,他們也把這些應用程式成為OpenSSL的指令。OpenSSL的應用程式主要包括金鑰生成、證書管理、格式轉換、資料加密和簽名、SSL測試以及其它輔助配置功能。 7.Engine機制
       Engine機制的出現是在OpenSSL的0.9.6版的事情,開始的時候是將普通版本跟支援Engine的版本分開的,到了OpenSSL的0.9.7版,Engine機制整合到了OpenSSL的核心中,成為了OpenSSL不可缺少的一部分。 Engine機制目的是為了使OpenSSL能夠透明地使用第三方提供的軟體加密庫或者硬體加密裝置進行加密。OpenSSL的Engine機制成功地達到了這個目的,這使得OpenSSL已經不僅僅使一個加密庫,而是提供了一個通用地加密介面,能夠與絕大部分加密庫或者加密裝置協調工作。當然,要使特定加密庫或加密裝置更OpenSSL協調工作,需要寫少量的介面程式碼,但是這樣的工作量並不大,雖然還是需要一點密碼學的知識。Engine機制的功能跟Windows提供的CSP功能目標是基本相同的。目前,OpenSSL的0.9.7版本支援的內嵌第三方加密裝置有8種,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬體加密裝置。現在還出現了支援PKCS#11介面的Engine介面,支援微軟CryptoAPI的介面也有人進行開發。當然,所有上述Engine介面支援不一定很全面,比如,可能支援其中一兩種公開金鑰演算法。 
  8.輔助功能 
       BIO機制是OpenSSL提供的一種高層IO介面,該介面封裝了幾乎所有型別的IO介面,如記憶體訪問、檔案訪問以及Socket等。這使得程式碼的重用性大幅度提高,OpenSSL提供API的複雜性也降低了很多。 
  OpenSSL對於隨機數的生成和管理也提供了一整套的解決方法和支援API函式。隨機數的好壞是決定一個金鑰是否安全的重要前提。 
  OpenSSL還提供了其它的一些輔助功能,如從口令生成金鑰的API,證書籤發和管理中的配置檔案機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發現很多這樣的小功能,讓你不斷有新的驚喜。

openssl學習方法 
通過學習 openssl,使用者能夠學到 PKI 方面的各種知識,其重要性不言而喻。以下為學習 openssl 的方法,供參考。 
1) 建立學習環境 
建立一個供除錯的 openssl 環境,可以是 windows平臺,也可以是 linux 或者其他平臺。使用者需有在這些平臺下除錯原始碼的能力。 
2)學習 openssl 的命令 
通過 openssl命令的學習,對 openssl有基本的瞭解。 
3) 學習 openssl原始碼並除錯主要的原始碼有: 
apps 目錄下的各個程式,對應於 openssl 的各項命令; 
demos 下的各種原始碼; 
engines 下的各種 engine實現; 
test 目錄下的各種原始碼。 
對於 openssl函式的學習,主要檢視 openssl 自身是如何呼叫的,或者檢視函式的實現。對於 openssl 中只有實現而沒有呼叫的函式,讀者需要自己寫原始碼或研究原始碼去學習。 
4) 學會使用 openssl 的asn.1編解碼 
openssl 中很多函式和原始碼都涉及到 asn1 編解碼,比如數字證書申請、數字證書、crl、ocsp、pkcs7、pkcs8、pkcs12 等。 
5) 查詢資料 
Linux 下主要用 man 就能檢視 openssl 命令和函式的幫助。Windows 使用者可用到 www.openss.org 去檢視線上幫助文件, 或者用 linux 下的命令 man2html 將幫助文件裝換為 html 格式。使用者也可以訪問 openssl.cn 論壇來學習 openssl。 
6) 學習 openssl相關書籍 
讀者可以參考《OpenSSL與網路資訊保安--基礎、結構和指令》 、 《NetworkSecurity with OpenSSL》(OReilly出版)和《OpenSSL for windows Developer’s Guide》。
備註:
1.Windows下將OpenSSL編譯成vs工程