当前位置:文档之家› 第19章 利用OpenSSL实现安全的Web Server程序

第19章 利用OpenSSL实现安全的Web Server程序

15
《计算机网络高级软件编程技术》
客户端与服务器的握手过程
1、发 出 SSL 握手信 号 证书 服务器 出示
应并 2、回
浏 览 器
3、验证服务器证 书,产生会话密钥 4、用服务器公 钥加密会话密钥 5、将加 密后的 会话密 钥
服 务 器
发给服 务器
6、解密得到 会话密钥 7、使用共享的会话密钥加密 通信,安全通道建立
18
《计算机网络高级软件编程技术》
Server端认证证书的生成
建立CA中心



生成CA中心的私钥 openssl req -newkey rsa:1024 -sha1 -keyout rootkey.pem -out rootreq.pem 生成CA中心的自签证书 openssl x509 -req -in rootreq.pem -sha1 -extensions v3_ca days 365 -signkey rootkey.pem -out rootcert.pem 生成Web服务器的私钥和认证请求 openssl req -newkey rsa:1024 -sha1 -keyout serverkey.pem out serverreq.pem
• OpenSSL为用户提供的命令行接口功能 非常丰富,如创建和管理证书、生成消 息摘要、加密和解密文件等 • 其命令行格式如下: openssl command [ command_opts ] [ command_args ]

command可以为x509、md5、sha1、des、 idea等
19
《计算机网络高级软件编程技术》
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
20
《计算机网络高级软件编程技术》
扩展与提高
客户端认证

OpenSSL提供的相关API如下: 设置可信CA证书文件 int SSL_CTX_load_verify_locations( SSL_CTX *ctx, const char * cafile, const char * cadir); 设置认证模式 int SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*verify_callback) (int, X509_STORE_CTX *)); 使用双向认证模式需要将mode的值置为: SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT
“十一五”国家重点图书 计算机科学与技术学科前沿丛书
计算机科学与技术学科研究生系列教材(中文版)
计算机网络 高级软件编程技术
吴功宜 董大凡 王 珺 刘 乾
1
《计算机网络高级软件编程技术》
第19章
利用OpenSSL实现安全 的Web Server程序
2
《计算机网络高级软件编程技术》
概述
由于HTTP采用明文传输,因此网络传输 中的重要数据有被第三方截获的危险。 HTTPS使用SSL在发送方将原始数据进 行加密,然后在接收方进行解密,有利于 Web数据的安全传输
3
《计算机网络高级软件编程技术》
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
4
《计算机网络高级软件编程技术》
编程训练目的
• 在基础类编程训练10的基础上,掌握基 于OpenSSL协议的安全Web Server的软 件结构的设计与编程实现 • 掌握利用OpenSSL生成认证证书的方法 • 熟悉客户端认证与利用IPSec实现安全通 信的方法
17
《计算机网络高级软件编程技术》
程序主要部分的实现(续)
3. 创建一个流式套接字在某个端口侦听 4. 创建ListenThread线程,接受客户端连 接请求 5. 创建ClientThread线程处理客户请求 6. 关闭连接并释放相关资源
// 在ClientThread线程完成客户端的请求后,需要释放以下资源: SSL_shutdown(ssl); // 关闭SSL连接 SSL_free(ssl); // 释放SSL结构 // 在服务器结束服务之前还需要释放在第2步中创建的SSL上下文环境: SSL_CTX_free(ctx);
IPSec尾
新IP头 IPSec头
IP头《计算机网络高级软件编程技术》
为Web服务器签发证书
openssl x509 -req -in serverreq.pem -sha1 -extensions usr_cert -CA rootcert.pem -CAkey rootkey.pem -CAcreateserial -out server.pem server.pem即为CA中心为Web服务器签发的证书
13
《计算机网络高级软件编程技术》
OpenSSL的编程接口
• • • • • 初始化OpenSSL库 建立上下文环境 建立连接 使用连接完成应用数据交换 关闭连接并释放相关资源
14
《计算机网络高级软件编程技术》
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
21

《计算机网络高级软件编程技术》
扩展与提高
基于IPSec的安全通信
1. IPSec体系结构
22
《计算机网络高级软件编程技术》
扩展与提高
基于IPSec的安全通信
2. IPSec工作模式
原始数据包: 传输模式下的数据包: 隧道模式下的数据包: IP头 TCP头 数据 数据
IP头
IPSec头 TCP头
《计算机网络高级软件编程技术》
OpenSSL库
• OpenSSL库的安装

安装VC++ 6.0 从官方网站/ActivePerl 下载ActivePerl的Win32版本并安装 从官方网站/下载OpenSSL 源代码并安装

7
《计算机网络高级软件编程技术》
程序运行的参考界面
8
《计算机网络高级软件编程技术》
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
9
《计算机网络高级软件编程技术》
SSL协议 • SSL协议栈
10
《计算机网络高级软件编程技术》
SSL握手协议
工作过程
11
16
《计算机网络高级软件编程技术》
程序主要部分的实现
1. 初始化OpenSSL库
SSL_library_init(); SSL_load_error_strings(); // 加载OpenSSL将会用到的算法 // 加载错误字符串
2. 建立上下文环境
SSL_METHOD *meth; SSL_CTX *ctx; //SSL_CTX对象 meth = SSLv23_method(); //相应的SSL结构能理解SL2.0、3.0以及TSL1.0 ctx = SSL_CTX_new(meth); //创建一个上下文环境 //指定所使用的证书文件 SSL_CTX_use_certificate_chain_file(ctx, “server.pem”); //设置密码回调函数 SSL_CTX_set_default_passwd_cb(ctx, password_cb); // 加载私钥文件 SSL_CTX_use_PrivateKey_file(ctx,“server.pem”,SSL_FILETYPE_PEM)); // 加载受信任的CA证书 SSL_CTX_load_verify_locations(ctx, "root.pem", 0);
在VC的Include files中增加[OpenSSL]\inc32目录 在Libray files中增加[openssl-0.9.8]\out32dll目录 其中,[OpenSSL]表示OpenSSL的安装目录
12

编程环境设置

《计算机网络高级软件编程技术》
OpenSSL的命令行接口
5
《计算机网络高级软件编程技术》
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
6
《计算机网络高级软件编程技术》
编程训练要求
编写程序,利用OpenSSL实现安全的Web Server,具体要求如下 :
• • • Server启动时可指定端口,缺省为443 可指定Web Server根目录的路径,比如C:\Server Server应能够并发处理多个请求,要求至少能支持 Get命令。可以增强Web Server的功能,如支持 Head、Post以及Delete命令等 书写必要的客户端测试程序用于发送HTTPS请求并 显示返回结果,也可使用一般的Web浏览器测试
相关主题