作者:Rainbow(不经历风雨,怎么见彩虹) 创作时间:2002-10-1 /******************************************************************************************************************** 声明:本文档用于学习与研究可以自由转载,无论以何种形式发布都必须保留完整的版权声明,商业用途不得转载.本人能力有限,如有问题欢迎交流与指正。 网站: 论坛:/forum/forum.html 邮件:rainbow_zrh@sina.com webmaster@infosecurity.org.cn *********************************************************************************************************************/ 1、以上对基于OpenSSL的mod_ssl进行了简要的分析,由于在很短的时间里将平常学习与工作过程中所做工作写下来,加上本人的水平有限,所以错误与不足再所难免,希望大家多多批评与指正。 2、同时也希望更多的人参与到研究、整理及翻译信息安全理论与应用技术的行列中来,努力提高中国的信息安全技术水平。 3、下面讲一个简单的应用实例 要求:基于apache的web应用,要求128位加密传输,基于x.509数字证书的身份认证,用户证书使用usbkey存贮证书。双因子认证。在应用能够取取用户的身份,进行控制。
实现方案: (1)给apache配置mod_ssl支持。 (2)使用CISO的企业级CA发证书,给apache配置证书。 (3)购买USB-key,在客户端安全驱动及CSP。在客户端安全根证书。 (4)修改mod_ssl的源代码,将认证过的信息加载到HTTP协议中,这样在脚本语言中可以取到用户的认证信息,就可以根据这个用户进行授权了。 修改的源码如下: a、在new一个连接的时候加入如下的代码:
在变量中加入sn与dn /* * Remember the peer certificate's DN and SN */ if ((xs = SSL_get_peer_certificate(ssl)) != NULL) { cp = X509_NAME_oneline(X509_get_subject_name(xs), NULL, 0); ap_ctx_set(fb->ctx, "ssl::client::dn", ap_pstrdup(conn->pool, cp));
lsn = ASN1_INTEGER_get(X509_get_serialNumber(xs)); cpsn = ap_psprintf(conn->pool,"%ld",lsn); ap_ctx_set(fb->ctx,"ssl::client::sn",cpsn);
OPENSSL_free(cp); X509_free(xs); } b、在post read request的时候加入如下的代码: 取出dn与sn // get the peer certificate's DN and SN
if ((clientdn = (char *)ap_ctx_get(r->connection->client->ctx, "ssl::client::dn")) != NULL) { ap_snprintf(dn, sizeof(dn), "%s", clientdn); ap_table_set(r->headers_in,"UserName",dn); } if ((clientsn = (char *)ap_ctx_get(r->connection->client->ctx, "ssl::client::sn")) != NULL) { ap_snprintf(sn, sizeof(sn), "%s", clientsn); ap_table_set(r->headers_in,"CertID",sn); } 例如使用PHP语言,就可以通过$_SERVER['username']就能取到用户身份信息。 其它的就不多说,有什么问题到论坛提问。
|