openssl代碼分析--- ssl庫 .

之前簡單分析了crypto庫,主要是針對常用的x509相關的code,其他的像pkcs7,pkcs12這樣的都非常類似,熟悉ASN1的話,那麼對代碼的理解會比較容易,所以也就不再贅述了。

對於ssl庫,我想最重要的就是搞清楚ssl handshake的code,清楚handshake過程和代碼的對應關係。

要搞清楚上面所說的關係,瞭解怎麼利用openssl來寫自己的ssl應用也是一個起步,所以首先把着手點放在s_server和s_client這2個openssl的app上,參照這2個app就可以很輕鬆的寫出自己的ssl based的app了。

ssl client的基本框架如下:

1. 初始化一個socket,直到調用connect建立連接

2. 調用OpenSSL_add_ssl_algorithms初始化連接過程需要的算法

3.調用SSLv23_client_method初始化一個SSL_MTHOD

4.調用SSL_load_error_strings載入錯誤信息字符串

5.調用SSL_CTX_new初始化一個SSL_CTX,參數爲之前初始化的SSL_METHOD

6.調用SSL_new初始化一個SSL,參數爲5中初始化的SSL_CTX

7.調用SSL_set_fd將socket和SSL綁定

8.調用SSL_connect連接ssl server,SSL_connect會完成所有的ssl handshake工作。

9.ssl 連接建立之後,就可以調用SSL_write或SSL_read讀寫ssl數據了。由於SSL和socket已經綁定,所以可以通過對socket進行select操作來監聽連接的數據,在進行ssl IO操作。

ssl server的代碼框架與之類似,可以參考s_server.c.

s_client和s_server的代碼遠遠複雜於上面所寫的基本框架,那是因爲ssl提供了非常多的接口,可以便於用戶控制整個連接的過程。這些API大多以SSL_set_xx的形式命名,具體可參考ssl.h頭文件的聲明。後面會結合分析連接建立的過程來了解這些API。

下面是從commons.wikimedia.org找到的一張不錯的SSL Handshake圖表,比較清晰的描述了SSL Handshake的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章