1. 程式人生 > >openssl程式碼分析(5) ssl庫

openssl程式碼分析(5) 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的過程。

Ssl_handshake_with_two_way_authentication_with_certificates.png