
OpenSSL程式設計入門(含完整示例)
易劍 2008/12/5
<a href="#_Toc5689%20">目錄 1</a>
<a href="#_Toc2277%20">1. 編寫目的 1</a>
<a href="#_Toc30261%20">2. 示例包 1</a>
<a href="#_Toc13878%20">3. 什麼是SSL? 2</a>
<a href="#_Toc5778%20">4. 什麼是openssl? 2</a>
<a href="#_Toc11216%20">5. 示例程式 2</a>
<a href="#_Toc17103%20">6. 服務端編寫步驟 3</a>
<a href="#_Toc19612%20">7. 用戶端編寫步驟 4</a>
<a href="#_Toc2571%20">8. 相關頭檔案 4</a>
<a href="#_Toc11175%20">8.1. socket頭檔案 4</a>
<a href="#_Toc14793%20">8.2. SSL頭檔案 4</a>
<a href="#_Toc29808%20">9. 結尾 5</a>
第一次跑起openssl示例并不太簡單,本文的目的是為了讓這個過程變得非常簡單。在開始之前,要非常感謝周立發同學,正是通過他共享的示例,較輕松的入了門。
本文檔對他共享的示例中的一個小錯誤進行了修正,并提供了傻瓜式的“編譯-生成-KEY運作”一條龍腳本(方法請參見壓縮包中的readme檔案),讓跑第一個openssl程式變得輕輕松松。

ssl_test.tar.gz為示例源代碼包,openssl-0.9.8h-SuSE10.tar.gz為openssl二進制包(因超過2M,不能作為附件下載下傳,請上官網下載下傳),測試時是安裝在/usr/local/ssl。
ssl_test.tar.gz中的示例在SuSE10中測試通過,使用的是openssl-0.9.8h,它包括如下檔案:
-rw-r--r-- 1 root root 1346 Dec 5 18:11 cacert.pem
-rwxr-xr-x 1 root root 114 Dec 5 18:11 make_key.sh
-rwxr-xr-x 1 root root 172 Dec 5 18:37 mk_client.sh
-rwxr-xr-x 1 root root 172 Dec 5 18:37 mk_server.sh
-rw-r--r-- 1 root root 1679 Dec 5 18:11 privkey.pem
-rw-r--r-- 1 root root 167 Dec 5 18:39 readme
-rwxr-xr-x 1 root root 38 Dec 5 18:38 run_client.sh
-rwxr-xr-x 1 root root 64 Dec 5 18:38 run_server.sh
-rwxr-xr-x 1 root root 1140142 Dec 5 18:38 ssl_client
-rw-r--r-- 1 root root 3928 Dec 5 17:31 ssl_client.cpp
-rwxr-xr-x 1 root root 1139667 Dec 5 18:38 ssl_server
-rw-r--r-- 1 root root 4882 Dec 5 17:31 ssl_server.cpp
readme為包内容說明,run_server.sh用來運作服務端,run_client.sh用來運作用戶端,mk_server.sh用來編譯服務端,mk_client.sh用來編譯用戶端,make_key.sh用來生成鑰匙KEY。
在學習openssl程式設計之前,先了解一下什麼是SSL,有助于後續的學習。SSL 是一個縮寫,代表的是 Secure Sockets Layer。它是支援在 Internet 上進行安全通信的标準,并且将資料密碼術內建到了協定之中。資料在離開您的計算機之前就已經被加密,然後隻有到達它預定的目标後才被解密。證書和密碼學算法支援了這一切的運轉,使用 OpenSSL,您将有機會切身體會它們。
理論上,如果加密的資料在到達目标之前被截取或竊聽,那些資料是不可能被破解的。不過,由于計算機的變化一年比一年快,而且密碼翻譯方法有了新的發展,是以,SSL 中使用的加密協定被破解的可能性也在增大。可以将 SSL 和安全連接配接用于 Internet 上任何類型的協定,不管是 HTTP、POP3,還是 FTP。還可以用 SSL 來保護 Telnet 會話。雖然可以用 SSL 保護任何連接配接,但是不必對每一類連接配接都使用 SSL。如果連接配接傳輸敏感資訊,則應使用 SSL。
OpenSSL 不僅僅是 SSL。它可以實作消息摘要、檔案的加密和解密、數字證書、數字簽名和随機數字。關于 OpenSSL 庫的内容非常多,遠不是一篇文章可以容納的。
OpenSSL 不隻是 API,它還是一個指令行工具。指令行工具可以完成與 API 同樣的工作,而且更進一步,可以測試 SSL 伺服器和客戶機。
示例的說明請參見下面這篇周立發共享的文章。

#include
上面步驟應當畫得比較清楚了,結合圖再對照ssl_test.tar.gz和《加密通訊協定SSL程式設計.pdf》就可以非常快地上手了。