apache(httpd-2.2.14) mod_ssl源碼分析之二(mod_ssl處理流程分析)

    在瞭解了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的處理是一樣的了。

    待續...

 

 

  

發佈了18 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章