以前简单分析了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的过程。