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