OpenSSL编程入门(第一部分)

OpenSSL编程入门(第一部分)
Eric Rescorla
RTFM, Inc.
ekr@rtfm.com
Version 1.0: October 5, 2001
1 介绍
保护一个基于TCP的网络程序最快也最容易的方法是使用SSL。如果你使用C工作,那你最好的选择可能就是使用OpenSSL了(网址:http://www.openssl.org)。OpenSSL是一个基于Eric Yongs的SSLeay包之上的SSL/TLS执行工具。不幸的是,OpenSSL所发布的文档和示例代码都远远不够值得期待。所存在的文档中,手册页都非常好,但是他们都缺乏大图片,因为手册页面只是用作参考而非指南。
我们提供一个OpenSSL编程的介绍。OpenSSL API是非常庞大并且复杂的,所以我们并不是想提供一个覆盖全面的说明。不过,希望能够教您如何利用手册来使工作变得更有效。在这一部分里,前两节,我们会生成一个简单的Web客户和服务器队来演示OpenSSL的基本功能。在第二部分中,我们介绍了一些高级的功能,比如session的恢复和客户认证。
我们假设您已经熟悉SSL和HTTP或者至少有这个概念。如果没有,请先从RFCs开始(参考本部分的最后)

2 源代码
由于空间的限制,这部分只包含了源代码的摘录。完整的机器可读格式源代码可以在作者的网站上找到http://www.rtfm.com/openssl-examples/

3 我们的程序
我们的客户端是一个简单的HTTPS(详见RFC2818)客户端,初始化一个到服务器的SSL连接,然后在这个连接上传输HTTP请求,等待服务器的反馈并在屏幕上显示。这在程序中是一个非常简单的功能。
服务器端程序是一个简单的HTTPS服务器,等待从客户端来的TCP连接。当接受了一个连接时,通过一个SSL连接。一旦这个连接建立,它开始读取客户端的HTTP请求,然后传送HTTP反馈到客户端。一旦反馈被传送,这个连接将被关闭。

3.1 上下文初始化
我们第一个任务是设置一个上下文对象(SSL_CTX)。这个上下文对象会为每一个SSL连接创建一个新的连接对象。而正是这些连接对象被用来进行SSL握手、读取和写操作。
这个方法有两个优点。第一,这个上下文之对象允许结构初始化一次来提高性能。在大部分的应用中,每个SSL连接将使用同样的发报信息、证书(CA)列表等。而非重新为每个连接载入这些信息,我们简单的在程序开始的时候载入到上下文对象中。只有一个上下文对象的第二个优点是允许多个SSL连接来共享数据,比如SSL会话缓存用来恢复会话。
上下文初始化包含四个基本的任务,所有的任务都在initialize_ctx()函数中执行。
42 SSL_CTX *initialize_ctx(keyfile,password)
43 char *keyfile;
44 char *password;
45 {
46 SSL_METHOD *meth;
47 SSL_CTX *ctx;
48
49 if(!bio_err){
50 /* Global system initialization*/
51 SSL_library_init();
52 SSL_load_error_strings();
53
54 /* An error write context */
55 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
56 }
57
58 /* Set up a SIGPIPE handler */
59 signal(SIGPIPE,sigpipe_handle);
60
61 /* Create our context*/
62 meth=SSLv23_method();
63 ctx=SSL_CTX_new(meth);
64
65 /* Load our keys and certificates*/
66 if(!(SSL_CTX_use_certificate_chain_file(ctx,
67 keyfile)))
68 berr_exit("Can’t read certificate file");
69
70 pass=password;
71 SSL_CTX_set_default_passwd_cb(ctx,
72 password_cb);
73 if(!(SSL_CTX_use_PrivateKey_file(ctx,
74 keyfile,SSL_FILETYPE_PEM)))
75 berr_exit("Can’t read key file");
76
77 /* Load the CAs we trust*/
78 if(!(SSL_CTX_load_verify_locations(ctx,
79 CA_LIST,0)))
80 berr_exit("Ca’t read CA list");
81 #if (OPENSSL_VERSION_NUMBER < 0x0090600fL)
82 SSL_CTX_set_verify_depth(ctx,1);
83 #endif
84
85 return ctx;
86 }
Figure 1 initialize_ctx()

第一章 基础知识 81.1 对称算法 81.2摘要算法 81.3 公钥算法 91.4 回调函数 11第二章 openssl简介 132.1 openssl简介 132.2 openssl安装 132.2.1 linux下的安装 132.2.2 windows编译与安装 132.3 openssl源代码 142.4 openssl学习方法 16第三章openssl堆栈 173.1 openssl堆栈 173.2 数据结构 173.3 源码 173.4 定义用户自己的堆栈函数 183.5 编程示例 19第四章 openssl哈希表 214.1 哈希表 214.2 哈希表数据结构 214.3 函数说明 224.4 编程示例 24第五章 openssl内存分配 275.1 openssl内存分配 275.2 内存数据结构 275.3 主要函数 285.4 编程示例 28第六章 Openssl动态模块加载 316.1 动态库加载 316.2 DSO概述 316.3 数据结构 316.4 编程示例 32第七章 openssl抽象IO 357.1 openssl抽象IO 357.2 数据结构 357.3 BIO 函数 367.4 编程示例 377.4.1 mem bio 377.4.2 file bio 377.4.3 socket bio 387.4.4 md BIO 407.4.5 cipher BIO 407.4.6 ssl BIO 417.4.7 其他示例 43第八章 Openssl配置文件 448.1 概述 448.2 openssl配置文件读取 448.3 主要函数 448.4 编程示例 45第九章 Openssl随机数 479.1 随机数 479.2 openssl随机数数据结构与源码 479.3 主要函数 489.4 编程示例 49第十章 Openssl文本数据库 5110.1 概述 5110.2 数据结构 5110.3 函数说明 5210.4 编程示例 52第十一章 Openssl大数 5511.1 介绍 5511.2 openssl大数表示 5511.3 大数函数 5511.4 使用示例 58第十二章 Openssl base64编解码 6512.1 BASE64编码介绍 6512.2 BASE64编解码原理 6512.3 主要函数 6612.4 编程示例 66第十三章 Openssl ASN1库 6913.1 ASN1简介 6913.2 DER编码 7013.3 ASN1基本类型示例 7113.4 openssl 的ASN.1库 7313.5 用openssl的ASN.1库DER编码 7413.6 Openssl的ASN.1宏 7513.7 ASN1常用函数 7613.8 属性证书编码 90第十四章 Openssl错误处理 9414.1 概述 9414.2 数据结构 9414.3 主要函数 9614.4 编程示例 98第十五章 Openssl摘要与HMAC 10115.1 概述 10115.2 openssl摘要实现 10115.3 函数说明 10115.4 编程示例 10215.5 HMAC 103第十六章 Openssl数据压缩 10516.1 简介 10516.2 数据结构 10516.3 函数说明 10616.4 openssl中压缩算法协商 10616.5 编程示例 107第十七章 Openssl RSA 10817.1 RSA介绍 10817.2 openssl的RSA实现 10817.3 RSA签名与验证过程 10917.4 数据结构 10917.4.1 RSA_METHOD 10917.4.2 RSA 11017.5 主要函数 11117.6编程示例 11217.6.1密钥生成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值