Apache API 钩子函数
作者:Rainbow(不经历风雨,怎么见彩虹) 创作时间:2002-10-1 /******************************************************************************************************************** 声明:本文档用于学习与研究可以自由转载,无论以何种形式发布都必须保留完整的版权声明,商业用途不得转载.本人能力有限,如有问题欢迎交流与指正。 网站: 论坛:/forum/forum.html 邮件:rainbow_zrh@sina.com webmaster@infosecurity.org.cn *********************************************************************************************************************/
1、ssl_hook_AddModule 【功能】:向核心注册模块。Ssl_engine_config.c中实现。 【过程描述】:声明MOD_SSL配置文件。调用ssl_var_register()、 ssl_ext_register()、 ssl_io_register()将模块链到APACHE核心。ssl_vendor_register注册VENDOR。 2、ssl_hook_RemoveModule 【功能】:向核心注销模块。Ssl_engine_config.c中实现。 【过程描述】:调用ssl_var_unregister()、 ssl_ext_unregister()、ssl_io_unregister()将模块从核心中注销。 3、ssl_hook_RewriteCommand 【功能】:指令重写。Ssl_engine_config.c中实现。 【过程描述】:如果定义与以前兼容则调用ssl_compat_directive函数进行重写,否则什么也不做。 4、ssl_hook_NewConnection 【功能】:将SSL连上accept socket时触发这个钩子函数,Apache1.3没有提供这个钩子函数,所以只能给http_mail打个补丁就可以了。 【过程描述】: 准备阶段:ssl_rand_seed初始化随机数生成器,SSL_new生成SSL对象,SSL_clear清除数据,SSL_set_session_id_context设置由ap_md5生成的会话ID,SSL_set_app_data设置应用数据,ap_ctx_new生成新的ap_ctx,然后往里添加变量ssl::request_rec,ssl::verify::depth,将新生成的结构用SSL_set_app_data2加到ssl对象中。SSL_set_fd将新建立的连接加到SSL上,接下来预设SSL_set_tmp_rsa_callback设置回调和SSL_set_verify_result设置客户端验证的结果。 握手阶段:SSL_is_init_finished判断是否完成握手,没有则由SSL_accept接受这个连接,如果失败,先判断失败的类型,进行分类错误处理:若返回SSL_ERROR_ZERO_RETURN,则由SSL_set_shutdown与SSL_smart_shutdown关闭SSL连接,SSL_free释放SSL对象,返回。若返回SSL_R_HTTP_REQUEST,则输出状态到日志,跳过请求行的剩余字节,伪造一个GET /mod_ssl:error:HTTP-request HTTP/1.0\r\n请求行,由SSL_set_shutdown与SSL_smart_shutdown关闭SSL连接,SSL_free释放SSL对象,友好的返回由Apache继续执行。若超时,返回SSL_ERROR_SYSCALL等进行类似处理,在这里不进行赘述。如果成功,接下来,进行处理客户验证的结果,SSL_get_verify_result返回X509_V_OK说明成功,不成功则由SSL_set_shutdown与SSL_smart_shutdown关闭SSL连接,SSL_free释放SSL对象,返回。如果成功取出对方的名字存在ssl::client::dn中。调用SSL_is_init_finished判断握手是否成功,不成功重复握手过程。成功继续下一个步骤。 收尾阶段:设置超时标志ssl::handshake::timeout为FALSE,调用ap::mod_ssl::vendor::new_connection钩子函数进行Vendor的更多处理。 5、ssl_hook_TimeoutConnection 【功能】:SSL握手阶段超时信号处理函数。 【过程描述】:设置超时标志为TRUE。 6、ssl_hook_CloseConnection 【功能】:在Socket关闭之间调用,在这里进行更多的SSL处理。 【过程描述】:首先由ap_bflush刷新缓冲区,从客户端socket的ctx中取出关闭通知信息,关闭SSL,设置cpType关闭类型为关闭通知消息对应的unclean、accurate、standard。SSL_smart_shutdown自然关闭,释放SSL对象。 7、ssl_hook_Translate 【功能】:URL转换处理函数 【过程描述】:将HTTPS连入的信息输出到日志,将SetEnvIf信息从request_rec移到conn_rec/BUF中,供关闭连接处理函数使用。 8、ssl_hook_Auth 【功能】:验证处理函数 【过程描述】:首先设置ssl-access-forbidden标志禁止访问,用户的DN当成用户名,密码还是密码,伪造HTTP的基本验证头。 9、ssl_hook_UserCheck 【功能】: 【过程描述】:如果设置了SSL_OPT_STRICTREQUIRE,ssl-access-forbidden,返回FORBIDDEN,否则返回DECLINED继续进行。 10、ssl_hook_Access 【功能】:存取处理函数 【过程描述】:从SSL_get_SSL_CTX中取出SSL_CTX,保存旧的加密套件,设置新的加密套件。如果新旧的加密套件都为空,则强制进行加密套件的重新协商。接着重写验证的深度,设置新的验证深度,如果设置不成功,强制进行验证深度的重新协商。重写对客户端的验证方式,记住旧的状态,设置新的状态。失败则强制进行验证方式的重新协商。装入CA证书,及证书生路径,设置新的证书路径。如果上面的重写过程需要进行重新协商,现在开始重新协商。 重新协商的过程是这样的:取对方的证书链与证书,取证书存贮区指针并初始化它,设置验证深度,进行证书验证,如果是完全的重新协商过程,则SSL_set_session_id_context设置会话ID结构,SSL_renegotiate,SSL_do_handshake重新开始握手,取对方证书的DN,检查协商的结果,检查SSLRequire的表达式。 11、ssl_hook_Fixup 【功能】: 【过程描述】:ap_table_set设置子进程环境变量r->subprocess_env中HTTPS值为on, SSL_SERVER_CERT为服务器证书,SSL_CLIENT_CERT值为客户端证书SSL_CLIENT_CERT_CHAIN_X为证书链内容。 12、ssl_hook_ReadReq 【功能】:读到请求后进行处理, 【过程描述】:从ctx中取出ssl对象与apctx对象,往request_rec中添加mothod与port为https与443,handler为mod_ssl:content-handler,让mod_ssl内容处理器遇到这类情况时进行处理。 13、ssl_hook_Handler 【功能】:内容处理函数 【过程描述】:如果request_rec中的uri前9个字节为/mod_ssl:,返回继续处理。如果为uri为/mod_ssl:error:HTTP-request返回错误的HTTP请求,同时输出正确用法的提示。
|