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的过程。

openssl代码分析(5) ssl库_第1张图片

你可能感兴趣的:(openssl代码分析(5) ssl库)