网络安全实训报告

网络安全实训报告

目录

一、 背景描述 ……………………………………………… 1

二、 实验环境 ……………………………………………… 1

三、 总体概述 ………………………………………………

四、 实验过程及结果分析 ……………………………………

五、 详细设计 …………………………………………………

六、 测试 ………………………………………………………...

七、 心得体会 …………………………………………………..

参考文献 …………………………………………………………

一、背景知识描述

CA 拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。它能保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际安全电子交易协议标准的电子商务安全证,并负责管理所有参与网上交易的个体所需的数字证书。

二、实验环境

Windows XP、Visual C++ 6.0、openssl

三、总体概述

程序分为两部分,客户端和服务器端,我们的目的是利用openssl开发包编写建立在SSL上的C/S程序,利用SSL/TLS的特性保证通信双方能够互相验证对方身份(真实性),并保证数据的完整性, 私密性。以达到对其传输信息进行加密。

功能结构图:

https://upload.fanwen118.com/wk-img/img100/2385400_1.jpg

四、实验过程及对结果的分析

1、建立openssl 环境

https://upload.fanwen118.com/wk-img/img100/2385400_2.jpg

2、下载CA 证书并对其进行分割

https://upload.fanwen118.com/wk-img/img100/2385400_3.jpg

3、 编写server端程序及编写client端程序

4、 利用证书,对通信进行加密

验证实验结果:

https://upload.fanwen118.com/wk-img/img100/2385400_4.jpg

这是连接成功服务器端的程序

https://upload.fanwen118.com/wk-img/img100/2385400_5.jpg

这是连接成功客户端的程序

五、详细设计

主要代码块的说明:

1、程序结构

客户端程序的框架为:

/*生成一个SSL结构*/

meth = SSLv23_client_method();

ctx = SSL_CTX_new (meth);

ssl = SSL_new(ctx);

/*下面是正常的TCP socket过程*/

printf("Begin tcp socket...\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); /* Server IP */

sa.sin_port = htons (PORT); /* Server Port number */

err = connect(sd, (struct sockaddr*) &sa,

sizeof(sa));

CHK_ERR(err, "connect");

/* TCP 链接已建立.开始 SSL 握手过程.......................... */

printf("Begin SSL negotiation \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("Begin SSL data exchange\n");

err = SSL_write (ssl, "Hello World!", strlen("Hello World!"));

CHK_SSL(err);

err = SSL_read (ssl, buf, sizeof(buf) - 1);

CHK_SSL(err);

buf[err] = '';

printf ("Got %d chars:'%s'\n", err, buf);

SSL_shutdown (ssl); /* send SSL/TLS close_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, (struct sockaddr*) &sa_cli, &client_len);

CHK_ERR(sd, "accept");

closesocket (listen_sd);

printf ("Connection from %lx, port %x\n",

sa_cli.sin_addr.s_addr, sa_cli.sin_port);

/*TCP连接已建立,进行服务端的SSL过程. */

printf("Begin server side SSL\n");

ssl = SSL_new (ctx);

CHK_NULL(ssl);

SSL_set_fd (ssl, sd);

err = SSL_accept (ssl);

printf("SSL_accept finished\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 %d chars:'%s'\n", err, buf);

err = SSL_write (ssl, "I hear you.", strlen("I hear you."));

CHK_SSL(err);

2、根据RFC2246(TLS1.0)整个TLS(SSL)的流程如下:

Client Server

ClientHello -------->

ServerHello

Certificate*

ServerKeyExchange*

CertificateRequest*

<-------- ServerHelloDone

Certificate*

ClientKeyExchange

CertificateVerify*

[ChangeCipherSpec]

Finished -------->

[ChangeCipherSpec]

<-------- Finished

Application Data <-------> Application Data

对程序来说,openssl将整个握手过程用一对函数体现,即客户端的SSL_connect和服务端的SSL_accept.而后的应用层数据交换则用SSL_read和 SSL_write来完成.

函数介绍:

1、int SSL_CTX_set_cipher_list(SSL_CTX *,const char *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、int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,const char *CApath);

要验证对方的话,当然装要有CA的证书了,此函数用来便是加载CA的证书文件的.

3、int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);

加载自己的证书文件.

4、int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);

加载自己的私钥,以用于签名.

5、int SSL_CTX_check_private_key(SSL_CTX *ctx);

调用了以上两个函数后,自己检验一下证书与私钥是否配对.

6、OpenSSL_add_ssl_algorithms()或SSLeay_add_ssl_algorithms()

其实都是调用int SSL_library_init(void)

进行一些必要的初始化工作,用openssl编写SSL/TLS程序的话第一句便应是它.

7、void SSL_load_error_strings(void );

如果想打印出一些方便阅读的调试信息的话,便要在一开始调用此函数.

8、void ERR_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源程序及文档

相关推荐