Openssl相关资料:
http://linchunai1212.blog.163.com/blog/#m=0&t=1&c=fks_084067093084088071084083095095087083080066086087082064
接触openssl已经有一段时间了,我读过很多源码,感觉不错的也就那么几个,linux内核是其中之 一,openssl也是其中之一。openssl说白了不是什么功能性的东西,而是提供了一个支撑性的底层框架,本质上和linux内核一样,但是和 apache有区别,apache明确的实现了一个功能,就是web服务器,而openssl中我认为最重要的就是它提供的BIO框架和EVP框架,与其 说openssl是一个ssl的实现不如说ssl只不过是openssl框架的一个demo,本质上openssl提供了一套抽象的IO接口,这就是
BIO,还有一套很容易使用的加密解密接口,这就是EVP,最后证实ssl这个协议使用了上述两类接口,如果从这个意义上讲的话,apache其实也是这 样的,在构建顶层的web服务器之前首先实现了一套apr通用框架,甚至memcahce使用的libevent也是这样,这就是说很多的成功的开源的代 码与其说是一种专用的程序倒不如说包含有一套通用的框架,而这个带代码的原始意义最后退化成了使用这个通用框架的一个实例,最起码我看好的几个开源项目都 是这样。策略和机制分离,可扩展性十分棒,用起来十分灵活。
首先,如果使用普通的设备文件方式的io,那么我们只需要BIO就可以了,因为BIO是链式的,所以你可以随意进行io过滤,如果想扩展网络协议栈,鲁迅 式的废话就是同样只需要BIO就可以了,但是条件是最下面的BIO必须是一个套接字,因为我们要在应用层扩展并且只能在应用层扩展,那么就必然要在套接字 之上扩展,ssl就是在普通套接字之上加入了安全保护功能。BIO统一了两种方式,其实目前为止也就这两种io的方式,一种是以可以抽象为设备文件的设备 为载体的IO,这种IO又可细分为块设备和字符设备的IO,对于块设备往往通过文件系统来访问;另一种以网络协议栈方式进行的网络IO,协议栈实现几乎一 切流程,整个协议栈的分层模型和文件系统/设备驱动的分层模型类似,openssl的BIO可以包容这二者的任何一种,并且还可以混合它们,本质上BIO 可以组合成通向世界任何一个地方的管道。
对于EVP,它提供了很多易用的加密解密接口函数,openssl本身已经自带了很多加密解密算法,利用这套EVP接口,你甚至可以轻松实现自己的加密解 密算法。EVP接口中封装了算法的流程,具体的算法由不同的策略来填充,这一点上所有优秀的东西几乎是一致的。
openssl导出的接口是十分容易使用的,基本都是一看声明就知道其用处。以下这个例子读取并且解析一个证书:
X509 * cert = NULL;
BIO *pbio = BIO_new_file((const char*)strPath, "r");
cert = PEM_read_bio_X509(pbio,NULL,NULL,NULL);