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

:简介:
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 来完成 .
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值