學(xué)習(xí)如何使用 OpenSSL —— 用于安全通信的最著名的開放庫 —— 的 API 有些強(qiáng)人所難,因為其文檔并不完全。您可以通過本文中的提示補(bǔ)充這方面的知識,并駕馭該 API。在建立基本的連接之后,就可以查看如何使用 OpenSSL 的 BIO 庫來建立安全連接和非安全連接。與此同時,您還會學(xué)到一些關(guān)于錯誤檢測的知識。OpenSSL API 的文檔有些含糊不清。因為還沒有多少關(guān)于 OpenSSL 使用的教程,所以對初學(xué)者來說,在應(yīng)用程序中使用它可能會有一些困難。那么怎樣才能使用 OpenSSL 實現(xiàn)一個基本的安全連接呢?本教程將幫助您解決這個問題。
學(xué)習(xí)如何實現(xiàn) OpenSSL 的困難部分在于其文檔的不完全。不完全的 API 文檔通常會妨礙開發(fā)人員使用該 API,而這通常意味著它注定要失敗。但 OpenSSL 仍然很活躍,而且正逐漸變得強(qiáng)大。這是為什么?
OpenSSL 是用于安全通信的最著名的開放庫。在 google 中搜索“SSL library”得到的返回結(jié)果中,列表最上方就是 OpenSSL。它誕生于 1998 年,源自 Eric Young 和 Tim Hudson 開發(fā)的 SSLeay 庫。其他 SSL 工具包包括遵循 GNU General Public License 發(fā)行的 GNU TLS,以及 Mozilla Network Security Services(NSS)(請參閱本文后面的 參考資料 ,以獲得其他信息)。
那么,是什么使得 OpenSSL 比 GNU TLS、Mozilla NSS 或其他所有的庫都優(yōu)越呢?許可是一方面因素(請參閱 參考資料)。此外,GNS TLS(迄今為止)只支持 TLS v1.0 和 SSL v3.0 協(xié)議,僅此而已。
Mozilla NSS 的發(fā)行既遵循 Mozilla Public License 又遵循 GNU GPL,它允許開發(fā)人員進(jìn)行選擇。不過,Mozilla NSS 比 OpenSSL 大,并且需要其他外部庫來對庫進(jìn)行編譯,而 OpenSSL 是完全自包含的。與 OpenSSL 相同,大部分 NSS API 也沒有文檔資料。Mozilla NSS 獲得了 PKCS #11 支持,該支持可以用于諸如智能卡這樣的加密標(biāo)志。OpenSSL 就不具備這一支持。
先決條件
要充分理解并利用本文,您應(yīng)該:
精通 C 編程。
熟悉 Internet 通信和支持 Internet 的應(yīng)用程序的編寫。并不絕對要求您熟悉 SSL ,因為稍后將給出對 SLL 的簡短說明;不過,如果您希望得到詳細(xì)論述 SSL 的文章的鏈接,請參閱 參考資料部分。擁有密碼學(xué)方面的知識固然好,但這并不是必需的。
什么是 SSL?
SSL 是一個縮寫,代表的是 Secure Sockets Layer。它是支持在 Internet 上進(jìn)行安全通信的標(biāo)準(zhǔn),并且將數(shù)據(jù)密碼術(shù)集成到了協(xié)議之中。數(shù)據(jù)在離開您的計算機(jī)之前就已經(jīng)被加密,然后只有到達(dá)它預(yù)定的目標(biāo)后才被解密。證書和密碼學(xué)算法支持了這一切的運(yùn)轉(zhuǎn),使用 OpenSSL,您將有機(jī)會切身體會它們。
理論上,如果加密的數(shù)據(jù)在到達(dá)目標(biāo)之前被截取或竊聽,那些數(shù)據(jù)是不可能被破解的。不過,由于計算機(jī)的變化一年比一年快,而且密碼翻譯方法有了新的發(fā)展,因此,SSL 中使用的加密協(xié)議被破解的可能性也在增大。
可以將 SSL 和安全連接用于 Internet 上任何類型的協(xié)議,不管是 HTTP、POP3,還是 FTP。還可以用 SSL 來保護(hù) Telnet 會話。雖然可以用 SSL 保護(hù)任何連接,但是不必對每一類連接都使用 SSL。如果連接傳輸敏感信息,則應(yīng)使用 SSL。
什么是 OpenSSL?
OpenSSL 不僅僅是 SSL。它可以實現(xiàn)消息摘要、文件的加密和解密、數(shù)字證書、數(shù)字簽名和隨機(jī)數(shù)字。關(guān)于 OpenSSL 庫的內(nèi)容非常多,遠(yuǎn)不是一篇文章可以容納的。
OpenSSL 不只是 API,它還是一個命令行工具。命令行工具可以完成與 API 同樣的工作,而且更進(jìn)一步,可以測試 SSL 服務(wù)器和客戶機(jī)。它還讓開發(fā)人員對 OpenSSL 的能力有一個認(rèn)識。要獲得關(guān)于如何使用 OpenSSL 命令行工具的資料,請參閱 參考資料部分。
您需要什么
首先需要的是最新版本的 OpenSSL。查閱參考資料部分,以確定從哪里可以獲得最新的可以自己編譯的源代碼,或者最新版本的二進(jìn)制文件(如果您不希望花費(fèi)時間來編譯的話)。不過,為了安全起見,我建議您下載最新的源代碼并自己編譯它。二進(jìn)制版本通常是由第三方而不是由 OpenSSL 的開發(fā)人員來編譯和發(fā)行的。
一些 Linux 的發(fā)行版本附帶了 OpenSSL 的二進(jìn)制版本,對于學(xué)習(xí)如何使用 OpenSSL 庫來說,這足夠了;不過,如果您打算去做一些實際的事情,那么一定要得到最新的版本,并保持該版本一直是最新的。
對于以 RPM 形式安裝的 Linux 發(fā)行版本(Red Hat、Mandrake 等),建議您通過從發(fā)行版本制造商那里獲得 RPM 程序包來更新您的 OpenSSL 發(fā)行版本。出于安全方面的原因,建議您使用最新版本的發(fā)行版本。如果您的發(fā)行版本不能使用最新版本的 OpenSSL,那么建議您只覆蓋庫文件,不要覆蓋可執(zhí)行文件。OpenSSL 附帶的 FAQ 文檔中包含了有關(guān)這方面的細(xì)節(jié)。
還要注意的是,OpenSSL 并沒有在所有的平臺上都獲得官方支持。雖然制造商已經(jīng)盡力使其能夠跨平臺兼容,但仍然存在 OpenSSL 不能用于您的計算機(jī) 和/或 操作系統(tǒng)的可能。請參閱 OpenSSL 的 Web 站點(diǎn)( 參考資料 中的鏈接),以獲得關(guān)于哪些平臺可以得到支持的信息。
如果想使用 OpenSSL 來生成證書請求和數(shù)字證書,那么必須創(chuàng)建一個配置文件。在 OpenSSL 程序包的 apps 文件夾中,有一個名為 openssl.cnf 的可用模板文件。我不會對該文件進(jìn)行討論,因為這不在本文要求范圍之內(nèi)。不過,該模板文件有一些非常好的注釋,而且如果在 Internet 上搜索,您可以找到很多討論修改該文件的教程。