以前簡單分析了crypto庫,主要是針對經常使用的x509相關的code,其餘的像pkcs7,pkcs12這樣的都很是相似,熟悉ASN1的話,那麼對代碼的理解會比較容易,因此也就再也不贅述了。算法
對於ssl庫,我想最重要的就是搞清楚ssl handshake的code,清楚handshake過程和代碼的對應關係。app
要搞清楚上面所說的關係,瞭解怎麼利用openssl來寫本身的ssl應用也是一個起步,因此首先把着手點放在s_server和s_client這2個openssl的app上,參照這2個app就能夠很輕鬆的寫出本身的ssl based的app了。框架
ssl client的基本框架以下:socket
1. 初始化一個socket,直到調用connect創建鏈接spa
2. 調用OpenSSL_add_ssl_algorithms初始化鏈接過程須要的算法.net
3.調用SSLv23_client_method初始化一個SSL_MTHODcode
4.調用SSL_load_error_strings載入錯誤信息字符串server
5.調用SSL_CTX_new初始化一個SSL_CTX,參數爲以前初始化的SSL_METHODblog
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的過程。