网络安全实训报告.docx
- 文档编号:2428325
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:15
- 大小:107.68KB
网络安全实训报告.docx
《网络安全实训报告.docx》由会员分享,可在线阅读,更多相关《网络安全实训报告.docx(15页珍藏版)》请在冰点文库上搜索。
网络安全实训报告
))))))))
)))))).
))))))))
一、背景描述………………………………………………1
二、实验环境………………………………………………1
三、总体概述………………………………………………
四、实验过程及结果分析……………………………………
五、详细设计…………………………………………………
六、测试………………………………………………………...
七、心得体会…………………………………………………..
参考文献…………………………………………………………
)))))).
))))))))
一、背景知识描述
CA拥有一个证书(内含公钥和私钥)。
网上的公众用户通过验证CA的签字从而信任CA,任何人都可以得到CA的证书(含公钥),用以验证它所签发的证书。
数字证书在用户公钥后附加了用户信息及CA的签名。
公钥是密钥对的一部分,另一部分是私钥。
公钥公之于众,谁都可以使用。
私钥只有自己知道。
由公钥加密的信息只能由与之相对应的私钥解密。
为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。
同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。
它能保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际安全电子交易协议标准的电子商务安全证,并负责管理所有参与网上交易的个体所需的数字证书。
二、实验环境
WindowsXP、VisualC++6.0、openssl
三、总体概述
程序分为两部分,客户端和服务器端,我们的目的是利用openssl开发包编写建立在
SSL上的C/S程序,利用SSL/TLS的特性保证通信双方能够互相验证对方身份(真实性),并保证数据的完整性,私密性。
以达到对其传输信息进行加密。
功能结构图:
)))))).
))))))))
ClientServer
阻塞等待客户端Recv()Send()
Socket()()SocketReturn聊天
聊天内容
Bind()
listen
IP
获取主机
()
Connect)Send客户端接收文件
accept
()
(()选择
客户选择是否同意
客户端发送文件
获取信息Send()退出
打开记录文件
Recv()
聊天内容
写入记录文件
Recv()
获取信息
Send()
聊天内容
聊天内容
写入记录文件
)))))).
))))))))
四、实验过程及对结果的分析
1、建立openssl环境
2、下载CA证书并对其进行分割
)))))).
))))))))
3、编写server端程序及编写client端程序
4、利用证书,对通信进行加密
验证实验结果:
这是连接成功服务器端的程序
这是连接成功客户端的程序
)))))).
))))))))
五、详细设计
主要代码块的说明:
1、程序结构
客户端程序的框架为:
/*生成一个SSL结构*/
meth=SSLv23_client_method();
ctx=SSL_CTX_new(meth);
ssl=SSL_new(ctx);
/*下面是正常的TCPsocket过程*/
printf(Begintcpsocket...\n);
sd=socket(AF_INET,SOCK_STREAM,0);CHK_ERR(sd,socket);
memset(&sa,'',sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(SERVER_ADDR);/*ServerIP*/
sa.sin_port=htons(PORT);/*ServerPortnumber*/
err=connect(sd,(structsockaddr*)&sa,
sizeof(sa));
CHK_ERR(err,connect);
/*TCP链接已建立.开始SSL握手过程..........................*/
printf(BeginSSLnegotiation\n);
ssl=SSL_new(ctx);
CHK_NULL(ssl);
SSL_set_fd(ssl,sd);
err=SSL_connect(ssl);
CHK_SSL(err);
/*把建立好的socket和SSL结构联系起来*/
SSL_set_fd(ssl,fd);
/*数据交换开始,用SSL_write,SSL_read代替write,read*/
printf(BeginSSLdataexchange\n);
err=SSL_write(ssl,HelloWorld!
strlen(HelloWorld!
));
CHK_SSL(err);
err=SSL_read(ssl,buf,sizeof(buf)-1);
CHK_SSL(err);
)))))).
))))))))
buf[err]='';
printf(Got%dchars:
'%s'\n,err,buf);
SSL_shutdown(ssl);/*sendSSL/TLSclose_notify*/
服务端程序的框架为:
/*生成一个SSL结构*/
meth=SSLv23_server_method();
ctx=SSL_CTX_new(meth);
ssl=SSL_new(ctx);
/*接受TCP链接*/
err=listen(listen_sd,5);
CHK_ERR(err,listen);
client_len=sizeof(sa_cli);
sd=accept(listen_sd,(structsockaddr*)&sa_cli,&client_len);
CHK_ERR(sd,accept);
closesocket(listen_sd);
printf(Connectionfrom%lx,port%x\n,
sa_cli.sin_addr.s_addr,sa_cli.sin_port);
/*TCP连接已建立,进行服务端的SSL过程.*/
printf(BeginserversideSSL\n);
ssl=SSL_new(ctx);
CHK_NULL(ssl);
SSL_set_fd(ssl,sd);
err=SSL_accept(ssl);
printf(SSL_acceptfinished\n);
CHK_SSL(err);/*把建立好的socket和SSL结构联系起来*/
SSL_set_fd(ssl,fd);
/*数据交换开始,用SSL_write,SSL_read代替write,read*/
err=SSL_read(ssl,buf,sizeof(buf)-1);
CHK_SSL(err);
buf[err]='';
printf(Got%dchars:
'%s'\n,err,buf);
err=SSL_write(ssl,Ihearyou.,strlen(Ihearyou.));
CHK_SSL(err);
2、根据RFC2246(TLS1.0)整个TLS(SSL)的流程如下:
ClientServer
)))))).
))))))))
ClientHello-------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<--------ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished-------->
[ChangeCipherSpec]
<--------Finished
ApplicationData<------->ApplicationData
对程序来说,openssl将整个握手过程用一对函数体现,即客户端的SSL_connect和服务端的SSL_accept.而后的应用层数据交换则用SSL_read和SSL_write来完成.
函数介绍:
1、intSSL_CTX_set_cipher_list(SSL_CTX*,constchar*str);
根据SSL/TLS规范,在ClientHello中,客户端会提交一份自己能够支持的加密方法的列表,由服务端选择一种方法后在ServerHello中通知服务端,从而完成加密算法的协商.
可用的算法有:
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DES-CBC3-SHA
DHE-DSS-RC4-SHA
IDEA-CBC-SHA
RC4-SHA
RC4-MD5
我们在程序中选用了RC4做加密,MD5做消息摘要(先进行MD5运算,后进行RC4加密).即SSL_CTX_set_cipher_list(ctx,RC4-MD5);
2、intSSL_CTX_load_verify_locations(SSL_CTX*ctx,constchar*CAfile,constchar*CApath);
要验证对方的话,当然装要有CA的证书了,此函数用来便是加载CA的证书文件的.
3、intSSL_CTX_use_certificate_file(SSL_CTX*ctx,constchar*file,inttype);
加载自己的证书文件.
4、intSSL_CTX_use_PrivateKey_file(SSL_CTX*ctx,constchar*file,inttype);
加载自己的私钥,以用于签名.
5、intSSL_CTX_check_private_key(SSL_CTX*ctx);
)))))).
))))))))
调用了以上两个函数后,自己检验一下证书与私钥是否配对.
6、OpenSSL_add_ssl_algorithms()或SSLeay_add_ssl_algorithms()
其实都是调用intSSL_library_init(void)
进行一些必要的初始化工作,用openssl编写SSL/TLS程序的话第一句便应是它.
7、voidSSL_load_error_strings(void);
如果想打印出一些方便阅读的调试信息的话,便要在一开始调用此函数.
8、voidERR_print_errors_fp(FILE*fp);
如果调用了SSL_load_error_strings()后,便可以随时用ERR_print_errors_fp()来打印错误信息了.
9、X509*SSL_get_peer_certificate(SSL*s);
握手完成后,便可以用此函数从SSL结构中提取出对方的证书(此时证书得到且已经验证过了)整理成X509结构.
六、测试
测试通信是否已经加密的方法:
使用网络监视器来验证在应用程序服务器与数据库服务器之间传送的数据是否已加密。
首先以明文形式发送数据,然后通过先配置服务器,再配置客户端来启用加密。
七、心得体会
在实验中,我感受到openssl是sslv2,sslv3,tlsv1的一份完整实现,内部包含了大量加密算法程序.其命令行提供了丰富的加密,验证,证书生成等功能,甚至可以用其建立一个完整的CA.与其同时,它也提供了一套完整的库函数,可用开发用SSL/TLS的通信程序.
我们这几天的实训内容是“CA证书服务器的建立与使用”,在开始的申请证书、导出包含公私钥的密钥文件、分割公私密钥时还是可以顺利完成的;但在编译openssl环境时,由于对控制台的操作不熟悉,走了弯路,而且在openssl的解压目录下执行命令时,未执行“ms\do_ms”命令,导致后续步骤出错,无法进行下去。
在最后的程序调试过程中,由于马虎,将添加在lib下的文件名输入错误,导致程序报错,找不到此文件,经过进一步的调试,程序无错误无警告,但服务器端运行时仍出现有要发送的错误报告,此问题还有待解决。
参考文献
1.SSL规范(draft302)
2.openssl源程序及文档
3.
)))))).
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络安全 报告