您的位置:首页 > 理论基础 > 计算机网络

apache(httpd-2.2.14) mod_ssl源码分析之二(mod_ssl处理流程分析)

2010-02-02 17:09 1071 查看
在了解了mod_ssl在处理流程中的位置以及整个apache是怎么处理mod_ssl挂钩后,我们就要先大体的知道mod_ssl内部是怎么调用和处理请求的。
首先将mod_ssl从Apache整体流程中剥离开,mod_ssl的处理流程由于挂钩的因素被零乱的打散到Apache的各个部分,但是对于模块本身而言且又是一个完成连贯的过程,这样做的好处是显而易见的,它可以灵活的通过代码配置在各个阶段发挥自己的作用,与其他模块甚至是核心很好的结合到一起,比如mod_http与mod_ssl,mod_ssl就是通过自己的过滤器将解密处理后的请求传递个mod_http模块,这样的例子在Apache中数不胜数,通过上一篇的分析我们可以清楚的看到它的流程大体可分为如下几个部分:
1.ssl_hook_pre_config(ap_hook_pre_config):初始化加密算法/初始化ssl库/加载加密算法等操作。
2.ssl_init_Module(ap_hook_post_config):工作很多,主要是读取证书、公私钥之类的操作
3.ssl_init_child(ap_hook_child_init):初始化在进程,这里是mod_ssl子进程初始化,主要是生成随机种子,重新获得互斥体.
以上都是Apache在启动时mod_ssl的函数调用。
4.ssl_hook_pre_connection(ap_hook_pre_connection):初始化连接上下文,最重要的是初始化了ssl的过滤器,该过滤器来真正加密解密/调用read()函数来读取客户端请求。
5.ssl_hook_ReadReq(ap_hook_post_read_request):对url进行判断是否正确。
6.ssl_init_ssl_connection:初始化ssl连接。
7.ssl_io_filter_init:初始化ssl过滤器。
8.ssl_io_input_add_filter:加入输入过滤器。
9.ssl_io_filter_input:运行ssl输入过滤器。
10.ssl_io_filter_connection:运行ssl过滤器连接。
11.SSL_accept:ssl函数,具体功能就是完成ssl握手。
12.ssl_io_input_read:ssl函数,具体功能就是读请求操作(解密)。
这几个部分是mod_ssl的核心处理函数,其中的很多函数都是以挂钩的形式分布在Apache的各个子处理流程中,在整体上显得很零乱,但是如果我们稍作整理它的过程就会变得清晰。

具体流程是这样的:

-----------------------
| ssl_hook_pre_config |
-----------------------
|
-----------------------
| ssl_init_Module |
-----------------------
|
-----------------------
| ssl_init_child |
-----------------------
|
-----------------------
| ssl_hook_pre_connection |
-----------------------
/ /
http请求分支 / / https 请求分支
----------------------- -----------------------
| ssl_hook_ReadReq | | ssl_init_ssl_connection |
---------------------- -----------------------
| |
----------------------- ---------------------
| ssl_hook_Access | | ssl_io_filter_init |
----------------------- ---------------------
| |
---------------------- -------------------------
| ssl_hook_Fixup | |ssl_io_input_add_filter|
---------------------- -------------------------
| |
---------------------- ----------------------
| ssl_hook_Insert_Filter | | ssl_io_filter_input |
---------------------- --------------------
|
-------------------------
|ssl_io_filter_connection|
-------------------------
/ /
/ /
------------ -------------------------
|SSL_accept| | ssl_io_input_read |
------------ -------------------------
|
----------------------
| ssl_hook_ReadReq |
----------------------
|
-----------------------
| ssl_hook_Access |
----------------------
|
----------------------
| ssl_hook_Fixup |
----------------------
|
----------------------
| ssl_hook_Insert_Filter |
----------------------

从图上可以清楚的看出,Apache在启动的时候会经历mod_ssl的三个挂钩ssl_hook_pre_config(ap_hook_pre_config)、ssl_init_Module(ap_hook_post_config)、ssl_init_child(ap_hook_child_init),这三个过程分别为openssl以及mod_ssl 做了相关的初始化工作(上面的功能已经提到),而关键是在挂钩ssl_hook_pre_connection(ap_hook_pre_connection),这个挂钩的作用是:当Apache的socket接收到请求时,会为处理请求分配一个新的子进程,core核心模块中的Connection.c文件的ap_process_connection()会调用挂钩函数ap_hook_pre_connection,而mod_ssl刚好实现了该挂钩的具体实例来判断是否需要建立openssl连接,如果不需要则会按照http的处理流程在读取请求的时候只调用core_in这个过滤器对网络中的http明文数据进行读取,如果需要建立openssl的连接则会调用ssl_init_ssl_connection函数对ssl连接进行初始化操作,在ssl_init_ssl_connection这个函数中最最重要的就是将mod_ssl的过滤器加入到Apache的过滤器列表中,在读取请求的时候会先调用mod_ssl的过滤器ssl_io_filter_input,在这个过滤器中再调用core_in对网络中的http密文数据进行读取,然后通过过滤器的回调技术与存储段技术将密文请求在mod_ssl中解密,这个解密过程包括握手阶段和数据传输阶段,剩下的操作就是和HTTP的处理是一样的了。

待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: