现在的位置: 首页 > 综合 > 正文

用OpenSSL编写SSL,TLS程序(1)

2014年10月16日 ⁄ 综合 ⁄ 共 1878字 ⁄ 字号 评论关闭
:简介:
SSL(Secure Socket Layer)netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0.TLS(Transport Layer Security)IETFTLS 工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,RFC2246.SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不 被监听,伪造和窜改.
 
openssl(www.openssl.org)
sslv2,sslv3,tlsv1的一份完整实现,内部包含了大量加密算法程序.其命令行提供了丰富的加密,验证,证书生成等功 ,甚至可以用其建立一个完整的CA.与其同时,它也提供了一套完整的库函数,可用开发用SSL/TLS的通信程序. Apachehttps两种版本 mod_sslapachessl均基于它实现的.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();
 
/*
把建立好的socketSSL结构联系起来*/
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();
 
/*
把建立好的socketSSL结构联系起来*/
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来完成.

 

抱歉!评论已关闭.