OpenSSL API 的文檔有些含糊不清。因?yàn)檫€沒(méi)有多少關(guān)于 OpenSSL 使用的教程,所以對(duì)初學(xué)者來(lái)說(shuō),在 應(yīng)用程序中使用它可能會(huì)有一些困難。那么怎樣才能使用 OpenSSL 實(shí)現(xiàn)一個(gè)基本的安全連接呢? 本教程將幫助您解決這個(gè)問(wèn)題。
學(xué)習(xí)如何實(shí)現(xiàn) OpenSSL 的困難部分在于其文檔的不完全。不完全的 API 文檔通常會(huì)妨礙開(kāi)發(fā)人員 使用該 API,而這通常意味著它注定要失敗。但 OpenSSL 仍然很活躍,而且正逐漸變得強(qiáng)大。這是為什么?
OpenSSL 是用于安全通信的最著名的開(kāi)放庫(kù)。在 google 中搜索“SSL library”得到的返回結(jié)果中, 列表最上方就是 OpenSSL。它誕生于 1998 年,源自 Eric Young 和 Tim Hudson 開(kāi)發(fā)的 SSLeay 庫(kù)。其他 SSL 工具包包括遵循 GNU General Public License 發(fā)行的 GNU TLS,以及 Mozilla Network Security Services(NSS)(請(qǐng)參閱本文后面的 參考資料 ,以獲得 其他信息)。
那么,是什么使得 OpenSSL 比 GNU TLS、Mozilla NSS 或其他所有的庫(kù)都優(yōu)越呢?許可是一方面因素 (請(qǐng)參閱 參考資料)。此外,GNS TLS(迄今為止)只支持 TLS v1.0 和 SSL v3.0 協(xié)議,僅此而已。
Mozilla NSS 的發(fā)行既遵循 Mozilla Public License 又遵循 GNU GPL,它允許開(kāi)發(fā)人員進(jìn)行選擇。 不過(guò),Mozilla NSS 比 OpenSSL 大,并且需要其他外部庫(kù)來(lái)對(duì)庫(kù)進(jìn)行編譯,而 OpenSSL 是完全 自包含的。與 OpenSSL 相同,大部分 NSS API 也沒(méi)有文檔資料。Mozilla NSS 獲得了 PKCS #11 支持,該支持可以用于諸如智能卡這樣的加密標(biāo)志。OpenSSL 就不具備這一支持。
先決條件
要充分理解并利用本文,您應(yīng)該:
精通 C 編程。
熟悉 Internet 通信和支持 Internet 的應(yīng)用程序的編寫(xiě)。
并不絕對(duì)要求您熟悉 SSL ,因?yàn)樯院髮⒔o出對(duì) SLL 的簡(jiǎn)短說(shuō)明;不過(guò),如果您希望得到詳細(xì)論述 SSL 的文章的鏈接,請(qǐng)參閱參考資料部分。擁有密碼學(xué)方面的知識(shí)固然好,但這 并不是必需的。
什么是 SSL?
SSL 是一個(gè)縮寫(xiě),代表的是 Secure Sockets Layer。它是支持在 Internet 上進(jìn)行安全通信的 標(biāo)準(zhǔn),并且將數(shù)據(jù)密碼術(shù)集成到了協(xié)議之中。數(shù)據(jù)在離開(kāi)您的計(jì)算機(jī)之前就已經(jīng)被加密,然后只有 到達(dá)它預(yù)定的目標(biāo)后才被解密。證書(shū)和密碼學(xué)算法支持了這一切的運(yùn)轉(zhuǎn),使用 OpenSSL,您將 有機(jī)會(huì)切身體會(huì)它們。
理論上,如果加密的數(shù)據(jù)在到達(dá)目標(biāo)之前被截取或竊聽(tīng),那些數(shù)據(jù)是不可能被破解的。不過(guò), 由于計(jì)算機(jī)的變化一年比一年快,而且密碼翻譯方法有了新的發(fā)展,因此,SSL 中使用的加密協(xié)議 被破解的可能性也在增大。
可以將 SSL 和安全連接用于 Internet 上任何類型的協(xié)議,不管是 HTTP、POP3,還是 FTP。還可以用 SSL 來(lái)保護(hù) Telnet 會(huì)話。雖然可以用 SSL 保護(hù)任何連接,但是不必對(duì)每一類連接都使用 SSL。 如果連接傳輸敏感信息,則應(yīng)使用 SSL。
什么是 OpenSSL?
OpenSSL 不僅僅是 SSL。它可以實(shí)現(xiàn)消息摘要、文件的加密和解密、數(shù)字證書(shū)、數(shù)字簽名 和隨機(jī)數(shù)字。關(guān)于 OpenSSL 庫(kù)的內(nèi)容非常多,遠(yuǎn)不是一篇文章可以容納的。
OpenSSL 不只是 API,它還是一個(gè)命令行工具。命令行工具可以完成與 API 同樣的工作, 而且更進(jìn)一步,可以測(cè)試 SSL 服務(wù)器和客戶機(jī)。它還讓開(kāi)發(fā)人員對(duì) OpenSSL 的能力有一個(gè) 認(rèn)識(shí)。要獲得關(guān)于如何使用 OpenSSL 命令行工具的資料,請(qǐng)參閱 參考資料部分。
您需要什么
首先需要的是最新版本的 OpenSSL。查閱參考資料部分,以確定從哪里可以獲得最新的可以自己編譯的源代碼, 或者最新版本的二進(jìn)制文件(如果您不希望花費(fèi)時(shí)間來(lái)編譯的話)。不過(guò),為了安全起見(jiàn), 我建議您下載最新的源代碼并自己編譯它。二進(jìn)制版本通常是由第三方而不是由 OpenSSL 的開(kāi)發(fā)人員來(lái)編譯和發(fā)行的。
一些 Linux 的發(fā)行版本附帶了 OpenSSL 的二進(jìn)制版本,對(duì)于學(xué)習(xí)如何使用 OpenSSL 庫(kù)來(lái)說(shuō),這足夠了;不過(guò), 如果您打算去做一些實(shí)際的事情,那么一定要得到最新的版本,并保持該版本一直是最新的。
對(duì)于以 RPM 形式安裝的 Linux 發(fā)行版本(Red Hat、Mandrake 等),建議您通過(guò)從發(fā)行版本制造商那里獲得 RPM 程序包來(lái)更新您的 OpenSSL 發(fā)行版本。出于安全方面的原因,建議您使用 最新版本的發(fā)行版本。如果您的發(fā)行版本不能使用最新版本的 OpenSSL,那么建議您只覆蓋庫(kù)文件,不要覆蓋 可執(zhí)行文件。OpenSSL 附帶的 FAQ 文檔中包含了有關(guān)這方面的細(xì)節(jié)。
還要注意的是,OpenSSL 并沒(méi)有在所有的平臺(tái)上都獲得官方支持。雖然制造商已經(jīng)盡力使其能夠跨平臺(tái)兼容, 但仍然存在 OpenSSL 不能用于您的計(jì)算機(jī) 和/或 操作系統(tǒng)的可能。請(qǐng)參閱 OpenSSL 的 Web 站點(diǎn)( 參考資料 中 的鏈接),以獲得關(guān)于哪些平臺(tái)可以得到支持的信息。
如果想使用 OpenSSL 來(lái)生成證書(shū)請(qǐng)求和數(shù)字證書(shū),那么必須創(chuàng)建一個(gè)配置文件。在 OpenSSL 程序包 的 apps 文件夾中,有一個(gè)名為 openssl.cnf 的 可用模板文件。我不會(huì)對(duì)該文件進(jìn)行討論,因?yàn)檫@不在本文要求范圍之內(nèi)。不過(guò),該模板文件有一些非常好的注釋,而且如果 在 Internet 上搜索,您可以找到很多討論修改該文件的教程。
頭文件和初始化
本教程所使用的頭文件只有三個(gè):ssl.h、bio.h 和 err.h。它們都位于 openssl 子目錄中,而且都是開(kāi)發(fā)您的項(xiàng)目 所必需的。要初始化 OpenSSL 庫(kù),只需要三個(gè)代碼行即可。清單 1 中列出了所有內(nèi)容。其他的頭文件 和/或 初始化函數(shù)可能 是其他一些功能所必需的。
清單 1. 必需的頭文件
建立非安全連接
不管連接是 安全的還是不安全的,OpenSSL 都使用了一個(gè)名為 BIO 的抽象庫(kù)來(lái)處理包括文件和套接字在內(nèi)的各種類型的通信。您還可以將 OpenSSL 設(shè)置成為一個(gè)過(guò)濾器,比如用于 UU 或 Base64 編碼的過(guò)濾器。
在這里對(duì) BIO 庫(kù)進(jìn)行全面說(shuō)明有點(diǎn)麻煩,所以我將根據(jù)需要一點(diǎn)一點(diǎn)地介紹它。首先, 我將向您展示如何建立一個(gè)標(biāo)準(zhǔn)的套接字連接。相對(duì)于使用 BSD 套接字庫(kù),該操作需要 的代碼行更少一些。
在建立連接(無(wú)論安全與否)之前,要?jiǎng)?chuàng)建一個(gè)指向 BIO 對(duì)象的指針。這類似于在標(biāo)準(zhǔn) C 中 為文件流創(chuàng)建 FILE 指針。
清單 2. 指針
1BIO * bio;
打開(kāi)連接
創(chuàng)建新的連接需要調(diào)用 BIO_new_connect 。您可以在同一個(gè)調(diào)用中同時(shí) 指定主機(jī)名和端口號(hào)。也可以將其拆分為兩個(gè)單獨(dú)的調(diào)用:一個(gè)是創(chuàng)建連接并設(shè)置主機(jī)名的 BIO_new_connect 調(diào)用,另一個(gè)是設(shè)置端口號(hào)的 BIO_set_conn_port (或者BIO_set_conn_int_port )調(diào)用。
不管怎樣,一旦 BIO 的主機(jī)名和端口號(hào)都已指定,該指針會(huì)嘗試打開(kāi)連接。沒(méi)有什么可以影響它。如果創(chuàng)建 BIO 對(duì)象時(shí)遇到問(wèn)題,指針將會(huì)是 NULL。為了確保連接成功,必須執(zhí)行 BIO_do_connect 調(diào)用。
清單 3. 創(chuàng)建并打開(kāi)連接
在這里,第一行代碼使用指定的主機(jī)名和端口創(chuàng)建了一個(gè)新的 BIO 對(duì)象,并以所示風(fēng)格對(duì)該對(duì)象進(jìn)行 格式化。例如, 如果您要連接到 www.ibm.com 的 80 端口,那么該字符串將是 www.ibm.com:80 。調(diào)用 BIO_do_connect 檢查連接是否成功。如果出錯(cuò),則返回 0 或 -1。
與服務(wù)器進(jìn)行通信
不管 BIO 對(duì)象是套接字還是文件,對(duì)其進(jìn)行的讀和寫(xiě)操作都是通過(guò)以下兩個(gè)函數(shù)來(lái)完成的: BIO_read 和 BIO_write 。 很簡(jiǎn)單,對(duì)吧?精彩之處就在于它始終如此。
BIO_read 將嘗試從服務(wù)器讀取一定數(shù)目的字節(jié)。它返回讀取的字節(jié)數(shù)、 0 或者 -1。在受阻塞的連接中,該函數(shù)返回 0,表示連接已經(jīng)關(guān)閉,而 -1 則表示連接出現(xiàn)錯(cuò)誤。在非阻塞連接的情況下,返回 0 表示沒(méi)有可以獲得的數(shù)據(jù),返回 -1 表示連接出錯(cuò)??梢哉{(diào)用 BIO_should_retry 來(lái)確定是否可能重復(fù)出現(xiàn)該錯(cuò)誤。
清單 4. 從連接讀取
BIO_write 會(huì)試著將字節(jié)寫(xiě)入套接字。它將返回實(shí)際寫(xiě)入的 字節(jié)數(shù)、0 或者 -1。同 BIO_read ,0 或 -1 不一定表示錯(cuò)誤。BIO_should_retry 是找出問(wèn)題的途徑。如果需要重試寫(xiě)操作,它必須 使用和前一次完全相同的參數(shù)。
清單 5. 寫(xiě)入到連接
關(guān)閉連接
關(guān)閉連接也很簡(jiǎn)單。您可以使用以下兩種方式之一來(lái)關(guān)閉連接: BIO_reset 或 BIO_free_all 。如果您還需要重新使用對(duì)象,那么請(qǐng)使用第一種方式。 如果您不再重新使用它,則可以使用第二種方式。
BIO_reset 關(guān)閉連接并重新設(shè)置 BIO 對(duì)象的內(nèi)部狀態(tài),以便可以重新使用連接。如果要在整個(gè)應(yīng)用程序中使用同一對(duì)象,比如使用一臺(tái)安全的聊天 客戶機(jī),那么這樣做是有益的。該函數(shù)沒(méi)有返回值。
BIO_free_all 所做正如其所言:它釋放內(nèi)部結(jié)構(gòu)體,并釋放 所有相關(guān)聯(lián)的內(nèi)存,其中包括關(guān)閉相關(guān)聯(lián)的套接字。如果將 BIO 嵌入于一個(gè)類中,那么應(yīng)該在類的 析構(gòu)函數(shù)中使用這個(gè)調(diào)用。
清單 6. 關(guān)閉連接
建立安全連接
現(xiàn)在需要給出建立安全連接需要做哪些事情。惟一要改變的地方就是建立并進(jìn)行連接。其他所有內(nèi)容都是相同的。
安全連接要求在連接建立后進(jìn)行握手。在握手過(guò)程中,服務(wù)器向客戶機(jī)發(fā)送一個(gè)證書(shū), 然后,客戶機(jī)根據(jù)一組可信任證書(shū)來(lái)核實(shí)該證書(shū)。它還將檢查證書(shū),以確保它沒(méi)有過(guò)期。要 檢驗(yàn)證書(shū)是可信任的,需要在連接建立之前提前加載一個(gè)可信任證書(shū)庫(kù)。
只有在服務(wù)器發(fā)出請(qǐng)求時(shí),客戶機(jī)才會(huì)向服務(wù)器發(fā)送一個(gè)證書(shū)。該過(guò)程叫做客戶機(jī)認(rèn)證。使用證書(shū), 在客戶機(jī)和服務(wù)器之間傳遞密碼參數(shù),以建立安全連接。盡管握手是在建立連接之后才進(jìn)行的,但是客戶機(jī)或服務(wù)器可以在任何時(shí)刻請(qǐng)求進(jìn)行一次新的握手。
參考資料 部分中列出的 Netscasp 文章 和 RFC 2246 ,對(duì)握手以及建立安全連接的其他方面的知識(shí)進(jìn)行了更詳盡的論述。
為安全連接進(jìn)行設(shè)置
為安全連接進(jìn)行設(shè)置要多幾行代碼。同時(shí)需要有另一個(gè)類型為 SSL_CTX 的指針。該結(jié)構(gòu)保存了一些 SSL 信息。您也可以利用它通過(guò) BIO 庫(kù)建立 SSL 連接??梢酝ㄟ^(guò)使用 SSL 方法函數(shù)調(diào)用 SSL_CTX_new 來(lái)創(chuàng)建這個(gè)結(jié)構(gòu),該方法函數(shù)通常是SSLv23_client_method 。
還需要另一個(gè) SSL 類型的指針來(lái)保持 SSL 連接結(jié)構(gòu)(這是短時(shí)間就能完成的一些連接所必需的)。以后還可以用該 SSL 指針來(lái)檢查連接信息或設(shè)置其他 SSL 參數(shù)。
清單 7. 設(shè)置 SSL 指針
1 SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());
2 SSL * ssl;
加載可信任證書(shū)庫(kù)
在創(chuàng)建上下文結(jié)構(gòu)之后,必須加載一個(gè)可信任證書(shū)庫(kù)。這是成功驗(yàn)證每個(gè)證書(shū)所必需的。如果 不能確認(rèn)證書(shū)是可信任的,那么 OpenSSL 會(huì)將證書(shū)標(biāo)記為無(wú)效(但連接仍可以繼續(xù))。
OpenSSL 附帶了一組可信任證書(shū)。它們位于源文件樹(shù)的 certs 目錄中。 不過(guò),每個(gè)證書(shū)都是一個(gè)獨(dú)立的文件 —— 也就是說(shuō),需要單獨(dú)加載每一個(gè)證書(shū)。在 certs 目錄下,還有一個(gè)存放過(guò)期證書(shū)的子目錄。試圖加載這些證書(shū)將會(huì)出錯(cuò)。
如果您愿意,可以分別加載每一個(gè)文件,但為了簡(jiǎn)便起見(jiàn),最新的 OpenSSL 發(fā)行版本的可信任證書(shū) 通常存放在源代碼檔案文件中,這些檔案文件位于名為“TrustStore.pem”的單個(gè)文件中。如果已經(jīng)有了一個(gè)可信任證書(shū)庫(kù), 并打算將它用于特定的項(xiàng)目中,那么只需使用您的文件替換清單 8 中的“TrustStore.pem”(或者使用 單獨(dú)的函數(shù)調(diào)用將它們?nèi)考虞d)即可。
可以調(diào)用 SSL_CTX_load_verify_locations 來(lái)加載可信任證書(shū)庫(kù)文件。這里要用到 三個(gè)參數(shù):上下文指針、可信任庫(kù)文件的路徑 和文件名,以及證書(shū)所在目錄的路徑。必須指定可信任庫(kù)文件或證書(shū)的目錄。 如果指定成功,則返回 1,如果遇到問(wèn)題,則返回 0。
清單 8. 加載信任庫(kù)
如果打算使用目錄存儲(chǔ)可信任庫(kù),那么必須要以特定的方式命名文件。OpenSSL 文檔清楚 地說(shuō)明了應(yīng)該如何去做,不過(guò),OpenSSL 附帶了一個(gè)名為 c_rehash 的工具, 它可以將文件夾配置為可用于 SSL_CTX_load_verify_locations 的 路徑參數(shù)。
清單 9. 配置證書(shū)文件夾并使用它
為了指定所有需要的驗(yàn)證證書(shū),您可以根據(jù)需要命名任意數(shù)量的單獨(dú)文件或文件夾。您還可以同時(shí)指定 文件和文件夾。
創(chuàng)建連接
將指向 SSL 上下文的指針作為惟一參數(shù),使用 BIO_new_ssl_connect 創(chuàng)建 BIO 對(duì)象。還需要獲得指向 SSL 結(jié)構(gòu)的指針。在本文中,只將該指針用于 SSL_set_mode 函數(shù)。而這個(gè)函數(shù)是用來(lái)設(shè)置 SSL_MODE_AUTO_RETRY 標(biāo)記的。使用這個(gè)選項(xiàng)進(jìn)行設(shè)置,如果服務(wù)器突然希望進(jìn)行 一次新的握手,那么 OpenSSL 可以在后臺(tái)處理它。如果沒(méi)有這個(gè)選項(xiàng),當(dāng)服務(wù)器希望進(jìn)行一次新的握手時(shí), 進(jìn)行讀或?qū)懖僮鞫紝⒎祷匾粋€(gè)錯(cuò)誤,同時(shí)還會(huì)在該過(guò)程中設(shè)置 retry 標(biāo)記。
清單 10. 設(shè)置 BIO 對(duì)象
設(shè)置 SSL 上下文結(jié)構(gòu)之后,就可以創(chuàng)建連接了。主機(jī)名是使用 BIO_set_conn_hostname 函數(shù) 設(shè)置的。主機(jī)名和端口的指定格式與前面的相同。該函數(shù)還可以打開(kāi)到主機(jī)的連接。為了確認(rèn)已經(jīng)成功打開(kāi)連接,必須 執(zhí)行對(duì) BIO_do_connect 的調(diào)用。該調(diào)用還將執(zhí)行握手來(lái)建立安全連接。
清單 11. 打開(kāi)安全連接
連接建立后,必須檢查證書(shū),以確定它是否有效。實(shí)際上,OpenSSL 為我們完成了這項(xiàng)任務(wù)。如果證書(shū)有致命的 問(wèn)題(例如,哈希值無(wú)效),那么將無(wú)法建立連接。但是,如果證書(shū)的問(wèn)題并不是致命的(當(dāng)它已經(jīng)過(guò)期 或者尚不合法時(shí)),那么仍可以繼續(xù)使用連接。
可以將 SSL 結(jié)構(gòu)作為惟一參數(shù),調(diào)用 SSL_get_verify_result 來(lái)查 明證書(shū)是否通過(guò)了 OpenSSL 的檢驗(yàn)。如果證書(shū)通過(guò)了包括信任檢查在內(nèi)的 OpenSSL 的內(nèi)部檢查,則返回 X509_V_OK。如果有地方出了問(wèn)題,則返回一個(gè)錯(cuò)誤代碼,該代碼被記錄在命令行工具的 verify 選項(xiàng)下。
應(yīng)該注意的是,驗(yàn)證失敗并不意味著連接不能使用。是否應(yīng)該使用連接取決于驗(yàn)證結(jié)果和安全方面的考慮。例如, 失敗的信任驗(yàn)證可能只是意味著沒(méi)有可信任的證書(shū)。連接仍然可用,只是需要從思想上提高安全意識(shí)。
清單 12. 檢查證書(shū)是否有效
這就是所需要的全部操作。通常,與服務(wù)器進(jìn)行通信都要使用 BIO_read 和 BIO_write 。并且只需調(diào)用 BIO_free_all 或BIO_reset ,就可以關(guān)閉 連接,具體調(diào)用哪一個(gè)方法取決于是否重用 BIO。
必須在結(jié)束應(yīng)用程序之前的某個(gè)時(shí)刻釋放 SSL 上下文結(jié)構(gòu)??梢哉{(diào)用 SSL_CTX_free 來(lái)釋放該結(jié)構(gòu)。
清單 13. 清除 SSL 上下文
1 SSL_CTX_free(ctx);
錯(cuò)誤檢測(cè)
顯然 OpenSSL 拋出了某種類型的錯(cuò)誤。這意味著什么?首先,您需要得到錯(cuò)誤代碼本身; ERR_get_error 可以完成這項(xiàng)任務(wù);然后,需要將錯(cuò)誤代碼轉(zhuǎn)換為錯(cuò)誤 字符串,它是一個(gè)指向由 SSL_load_error_strings 或 ERR_load_BIO_strings 加載到內(nèi)存中的永久字符串的指針。 可以在一個(gè)嵌套調(diào)用中完成這項(xiàng)操作。
表 1 略述了從錯(cuò)誤棧檢索錯(cuò)誤的方法。清單 24 展示了如何打印文本字符串中的最后一個(gè) 錯(cuò)誤信息。
表 1. 從棧中檢索錯(cuò)誤
清單 14. 打印出最后一個(gè)錯(cuò)誤
1 printf(“Error: %s\n”, ERR_reason_error_string(ERR_get_error()));
您還可以讓庫(kù)給出預(yù)先格式化了的錯(cuò)誤字符串??梢哉{(diào)用 ERR_error_string 來(lái) 得到該字符串。該函數(shù)將錯(cuò)誤代碼和一個(gè)預(yù)分配的緩沖區(qū)作為參數(shù)。而這個(gè)緩沖區(qū)必須是 256 字節(jié)長(zhǎng)。如果參數(shù) 為 NULL,則 OpenSSL 會(huì)將字符串寫(xiě)入到一個(gè)長(zhǎng)度為 256 字節(jié)的靜態(tài)緩沖區(qū)中,并返回指向該緩沖區(qū)的 指針。否則,它將返回您給出的指針。如果您選擇的是靜態(tài)緩沖區(qū)選項(xiàng),那么在下一次調(diào)用 ERR_error_string 時(shí),該緩沖區(qū)會(huì)被覆蓋。
清單 15. 獲得預(yù)先格式化的錯(cuò)誤字符串
1 printf(“%s\n”, ERR_error_string(ERR_get_error(), NULL));
您還可以將整個(gè)錯(cuò)誤隊(duì)列轉(zhuǎn)儲(chǔ)到文件或 BIO 中??梢酝ㄟ^(guò) ERR_print_errors 或 ERR_print_errors_fp 來(lái)實(shí)現(xiàn)這項(xiàng)操作。隊(duì)列是以可讀格式被轉(zhuǎn)儲(chǔ)的。第一個(gè)函數(shù)將隊(duì)列發(fā)送到 BIO ,第二個(gè)函數(shù)將隊(duì)列發(fā)送到 FILE 。 字符串格式如下(引自 OpenSSL 文檔):
[pid]:error:[error code]:[library name]:[function name]:[reason string]:[file name]:[line]:[optional text message]
其中, [pid] 是進(jìn)程 ID, [error code] 是一個(gè) 8 位十六進(jìn)制代碼, [file name] 是 OpenSSL 庫(kù)中的源代碼文件, [line]是源文件中的行號(hào)。
清單 16. 轉(zhuǎn)儲(chǔ)錯(cuò)誤隊(duì)列
1 ERR_print_errors_fp(FILE *);
2 ERR_print_errors(BIO *);
開(kāi)始做吧
使用 OpenSSL 創(chuàng)建基本的連接并不困難,但是,當(dāng)試著確定該如何去做時(shí),文檔可能是一個(gè)小障礙。本文向您介紹了一些基本概念,但 OpenSSL 還有很多靈活之處有待發(fā)掘,而且 您還可能需要一些高級(jí)設(shè)置,以便項(xiàng)目能夠充分利用 SSL 的功能。
本文中有兩個(gè)樣例。一個(gè)樣例展示了到 http://www.verisign.com/ 的非安全連接,另一個(gè)則展示了到 http://www.verisign.com/ 的安全 SSL 連接。兩者都是連接到服務(wù)器并下載其主頁(yè)。它們沒(méi)有進(jìn)行 任何安全檢查,而且?guī)熘械乃性O(shè)置都是默認(rèn)值 —— 作為本文的一部分,應(yīng)該只將這些用于教學(xué)目的。
在任何支持的平臺(tái)上,源代碼的編譯都應(yīng)該是非常容易的,不過(guò)我建議您使用最新版本的 OpenSSL。在撰寫(xiě)本文時(shí),OpenSSL 的最新版本是 0.9.7d。
-
OpenSSL
+關(guān)注
關(guān)注
0文章
21瀏覽量
8677
原文標(biāo)題:使用 OpenSSL API 進(jìn)行安全編程
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論