如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
HYPERLINK"http://blog.csdn.net/yxyhack/article/details/4411707"openssl程序设计详解作者:EricRescorlaonSat,2001-09-0101:0如果你急切的想构建一个简单的Web客户端和服务器对,这时你就需要使用SSL了..SSL是一种保护基于TCP协议的网络应用最快而且最简单的的方法,如果你正在用C语言做开发,那么对于你来说,最好的选择可能就是使用OpenSSL了.OpenSSL是在EricYoung的SSLeay包的基础上对TSL/SSL的一个免费的执行(类似于BSD方式的License).然而,不幸运的事情是,伴随OpenSSL一起发布的文档和示例代码并不是很完全,使用它的人需要更多的东西.在OpenSSL被使用之处,man手册都相当优秀,可是这些手册失去了大的背景因为它们只是参考资料而不是教程.OpenSSL的API多而复杂,因此我们在此并不会作出一个完整的讲述.相反,我的目的只是教会你如何去高效的使用man手册.在本文中,我们将会通过构建一个简单的Web客户端和服务器来演示OpenSSL的基本特点.而在后续的第二篇中我们将会介绍OpenSSL的一些高级特性,比如会话恢复和客户端认证等.在话题开始之前,我会认为你已经熟悉SSL和HTTP了,或者最起码在概念层上应该有一些了解.如果你对此一无所知,推荐一个比较好的方法,那就是参考RFC(参见附录).由于篇幅原因,本文只包涵了源代码的一些摘录,完整的代码可以从作者的站点HYPERLINK"http://www.rtfm.com/openssl-examples/"\t"_blank"http://www.rtfm.com/openssl-examples/上下载.程序我们的客户端是一个简单的HTTPS(见RFC281客户端,它在初始化了一个到达服务器的SSL连接之后便通过这个连接将HTTP请求传送给HTTP服务器.然后等待服务器端的响应,并将响应信息打印在屏幕上.这是对通常那些”获取并且打印信息”的程序功能更简化的一个例子.服务器端程序是一个简单的HTTPS服务器,它等待从客户端发出的TCP连接,每当接收到一个连接时,它会磋商这个连接(的合法性).一旦这个连接被确定下来,它会读取客户端的HTTP请求,并将HTTP请求的响应信息传输给客户端.当响应传输完毕时它会关闭这个连接.我们的第一个任务就是建立一个上下文对象(一个SSL_CTX),这个上下文对象会在每次需要建立新的SSL连接的时候被用来创建一个新的连接对象.而这些连接对象则用于SSL的握手,读和写.(使用上下文对象)这种方法有两个优点:首先,上下文对象允许一次初始化多个结构体,这样就提提高了性能.在大多数应用中,每一个SSL连接都使用相同的加密算法(keyingmaterial)和CA(certificateauthority)列表等.而采用上面这种方法,我们就不需要在每次连接的时都去加载这些信息(加密算法和证书),而只需要在程序启动时将它们加载进上下文对象中.然后,当我们需要创建一个新的连接时,只需要将新的连接简单的指向这个上下文对象就可以了.使用一个简单的上下文对象的第二个好处就是它允许多个SSL连接之间共享数据,比如用于SSL会话恢复的SSL缓冲(cache).上下文初始化由主要的四个任务组成,通过列表1所示的initialize_ctx()函数来完成.列表1initialize_ctx()在应用OpenSSL之前,整个库需要进行初始化,这个过程通过SSL_library_init()函数来完成,它主要加载OpenSSL将会用到的算法,如果我们想要很好的报告差错信息,同样需要通过SSL_load_error_strings()来加载错误字符串,否则,就不能够将OpenSSL的错误映射为字符串.我们同样需要创建一个对象来作为错误打印的上下文.OpenSSL为输入和输出抽象了一个叫做BIO对象的概念.这样可以使得程序员针对不同种类的IO通道(socket,中断,内存缓冲等)使用相同的函数,而唯一的差别就是在函数中使用的是不同种类的BIO对象.在本例中,我们通过将一个BIO对象与标准错误stderr绑定来打印错误信息.如果你正在写一个能够执行客户端认证的服务器或者客户端程序,你就需要加载自己的公钥或者私钥以及相关的证书.证书存储空隙中,并且通过SSL_CTX_use_certificate_chain_file()函数与CA证书一起被加载形成证书链表.SSL_CTX_use_PrivateKey_file()函数用来加载私钥.出于安全原因,私钥通常通过密码来加密,如果使用密码加密的话,密码回调函数(通过SSL_CTX