当前位置:文档之家› ssl协议未开启如何处理

ssl协议未开启如何处理

竭诚为您提供优质文档/双击可除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);

}

//加载服务器端的私钥

相关主题