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()
OpenSSL编程入门(第一部分)
最新推荐文章于 2023-12-09 16:45:52 发布