一、简介
SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版.TLS(Transport Layer Security)是IETF的TLS 工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,即RFC2246.SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不 被监听,伪造和窜改. openssl(www.openssl.org)是sslv2,sslv3,tlsv1的一份完整实现,内部包含了大量加密算法程序.其命令行提供了丰富的加密,验证,证书生成等功 能,甚至可以用其建立一个完整的CA.与其同时,它也提供了一套完整的库函数,可用开发用SSL/TLS的通信程序. Apache的https两种版本 mod_ssl和apachessl均基于它实现的.openssl继承于ssleay,并做了一定的扩展,当前的版本是0.9.5a. openssl的缺点是文档太少,连一份完整的函数说明都没有,man page也至今没做完整:-(,如果想用它编程序,除了熟悉已有的文档(包括 ssleay,mod_ssl,apachessl的文档)外,可以到它的maillist上找相关的帖子,许多问题可以在以前的文章中找到答案. 编程:
程序分为两部分,客户端和服务器端,我们的目的是利用SSL/TLS的特性保证通信双方能够互相验证对方身份(真实性),并保证数据的完整性, 私密性. 1. 客户端程序的框架为:
/*生成一个SSL结构*/ meth = SSLv23_client_method(); ctx = SSL_CTX_new (meth); ssl = SSL_new(ctx); /*下面是正常的socket过程*/ fd = socket(); connect(); /*把建立好的socket和SSL结构联系起来*/ SSL_set_fd(ssl,fd); /*SSL的握手过程*/ SSL_connect(ssl); /*接下来用SSL_write(), SSL_read()代替原有的write(),read()即可*/ SSL_write(ssl,"Hello world",strlen("Hello World!")); 2. 服务端程序的框架为:
/*生成一个SSL结构*/ meth = SSLv23_server_method(); ctx = SSL_CTX_new (meth); ssl = SSL_new(ctx); /*下面是正常的socket过程*/ fd = socket(); bind(); listen(); accept(); /*把建立好的socket和SSL结构联系起来*/ SSL_set_fd(ssl,fd); /*SSL的握手过程*/ SSL_connect(ssl); /*接下来用SSL_write(), SSL_read()代替原有的write(),read()即可*/ SSL_read (ssl, buf, sizeof(buf)); 根据RFC2246(TLS1.0)整个TLS(SSL)的流程如下:
Client Server ClientHello --------> ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data 对程序来说,openssl将整个握手过程用一对函数体现,即客户端的SSL_connect和服务端的SSL_accept.而后的应用层数据交换则用SSL_read和 SSL_write来完成.
-- ※ 链接: http://www.sqlite.com.cn/POParticle/16/168.Html
|