竭诚为您提供优质文档/双击可除ssl协议未开启如何处理
篇一:ssl协议_openssl_附代码
ssl协议
1实验原理
1.1ssl协议
ssl(securesocketlayer,安全套接字层)在通信双方间建立了一个传输层安全通道,它使用对称加密来保证通信保密性,使用消息认证码(mac)来保证数据完整性,并且在建立连接时主要使用pki对通信双方进行身份认证。netscapenavigator和internetexplorer都支持ssl。
1.2ssl协议的分层结构
ssl协议基于c/s(client/server)模式,位于tcp/ip 协议与各种应用层协议之间,为数据通信提供安全支持。它可分为两层:
1.ssl记录协议(sslRecordprotocol)
它建立在可靠的传输控制协议(如tcp)之上,为高层协
议提供数据封装、压缩、加密等基本功能的支持。
2.ssl握手协议(sslhandshakeprotocol)
它建立在ssl记录协议之上,用于在实际的数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
作为分层的协议,在每一层,消息可以包含长度、描述和内容字段。ssl发出消息,先把数据分成可管理的块,然后压缩、加密并发出加密后的结果。接收消息后进行解密、验证、解压和重组,再把结果发往更高一层的客户。
1.3ssl握手协议
ssl握手协议的作用是在正式的秘密通信之前,让服务器和客户之间互相鉴别对方的身份并协商一种会话的加密
算法和加密密钥,主要可分为以下两个方面:
(1)客户端和服务器端之间互相验证身份
c/s主要是通过证书来验证,首先通过对方证书中权威发证机构签字的验证,
来确定对方拥有的证书是否有效。如果证书有效,接着就从这个证书中提取出公钥,通过对方的签名验证用户是不是假冒的。如果二者都通过,则证明对方的身份是真实可信的。其中服务器对客户端的验证是可选的。
(2)客户端和服务器之间协商安全参数
协商的参数一般包括协议的版本号、密钥交换算法、数
据加密算法和hash算法,通过协商达成一致性。其中版本号一般要求一致。关于密钥交换算法和数据加密算法,是先由客户端向服务器端发送一个列表,其中详细列举了客户端所支持的算法,然后由服务器端从中选取自己支持且加密性能优良的算法,将其返回给客户端,至此完成了算法的协商;最后由客户端随机产生一个用于数据加密的对称密钥,用一种商议好的密钥交换协议将它传给服务器端。ssl支持的密钥交换算法有Rsa密钥交换和diffie-hellman密钥交换两种。
ssl握手协议顺序图
2实验内容
2.1实验环境
1、win7
2、Vs20xx
3、openssl函数库
2.2实验代码
2.2.1server端
//ssl_server.cpp:定义控制台应用程序的入口点。
//
//server
#include"stdafx.h"
#include
#include
#include
#include"openssl/x509.h"
#include"openssl/ssl.h"
#include"openssl/err.h"
#definemsglength1024
#definepoRt8888
#definecaceRt"./private/ca.crt"
#definesVRceRtF"./certs/server.crt" #definesVRkeyF"./private/server.key" #pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"libeay32.lib") #pragmacomment(lib,"ssleay32.lib") int_tmain(intargc,_tchaR*argv[]) {
wsadatawsadata;
wsastartup(makewoRd(2,2), socketsock;
ssl_method*meth;
ssl_ctx*ctx;
ssl*ssl;
//ssl初始化
openssl_add_ssl_algorithms();
//ssl错误信息初始化
ssl_load_error_strings();
//创建本次会话所使用的协议
meth=(ssl_method*)tlsv1_server_method();
//申请ssl会话的环境
ctx=ssl_ctx_new(meth);
if(null==ctx)
exit(1);
//设置会话的握手方式并加载ca证书
ssl_ctx_set_verify(ctx,ssl_VeRiFy_peeR,null);
if(!ssl_ctx_load_verify_locations(ctx,caceRt,null)) {}printf("%d\n\n下载ca证书出错!
\n",ssl_ctx_load_verify_locations(ctx,caceRt,exit(-1);null));
//加载服务器端的证书
if(!ssl_ctx_use_certificate_file(ctx,sVRceRtF,ssl_F iletype_pem)){eRR_print_errors_fp(stderr);
exit(1);
}
//加载服务器端的私钥