版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o\h\z一概述 21. 课程设计的目的 22. 课程设计的要求 23. 课程设计环境 2二总体方案设计 2三详细设计 21. OpenSSL的安装和编译 22. 公私钥的分割 43. 证书文件的生成 44. 客户端和服务器端代码的编写 8四程序运行结果说明 10五心得体会 11六附录 111. 客户端代码: 112. 服务端代码: 15
一概述课程设计的目的本课程设计的目的是,使学生掌握CA认证的知识,并能够使用证书完成用户身份的认证和通信过程中的安全保密。课程设计的要求利用openssl开发包编写建立在SSL上的C/S程序,包含客户端和服务器端程序。要求每组不超过两人,协作完成程序和课程设计报告。课程设计环境预装有VC++6.0的Windows操作系统二总体方案设计Windows下进行OpenSSL编程的主要步骤:访问/certsrv申请证书、导出包含公私钥的pfx文件;安装ActivePerl-11-MSWin32-x86-122208.msi。阅读openssl开发包中的install.w32、编译openssl;阅读相关文档,熟悉OpenSSL编程接口,编写server和client端代码;将所需要的文件放到源代码目录,调试并运行程序,验证进行安全通信的过程及身份认证方式。三详细设计OpenSSL的安装和编译首先按提示安装ActivePerl-11-MSWin32-x86-122208.msi,解压openssl压缩包。点击“开始”——“运行”输入cmd并回车打开命令行窗口。分别执行命令PerlConfigureVC-WIN32和ms\do_masm,截图如下。转到VC所在目录下的vc98\bin目录,执行vcvars32批处理命令,设置VC的环境变量,然后再转到openssl解压包的根目录下。在openssl解压目录下执行nmake-fms\ntdll.mak,等待编译完成。输出的文件在out32dll里面,包括应用程序的可执行文件、两个Lib文件和两个dll文件,生成的文件用于C/S程序的执行。公私钥的分割从IE导出的pfx文件,文件名为mykey.pfx,密码为“1234”;进入OpenSSL目录,在openssl环境下运行命令pkcs12–ind:\ok\mykey.pfx–outd:\ok\mypem.pem;Ultraedit打开mypem.pem,找到BEGINRSAPRIVATEKEY…….ENDRSAPRIVATEKEY将这一部分内容复制并另存为prikey.pem,即私钥文件。找到BEGINCERTIFICATE……….ENDCERTIFICATE将这一部分内容复制并另存为cerkey.pem,即公钥钥文件。 因服务器原因,公私钥分割的过程没有进行验证,而是直接利用分割好的文件进行后续设计。证书文件的生成这一步需要生成的文件有客户端证书client.crt、服务器端证书server.crt、CA证书ca.crt。具体执行步骤如下:首先要生成服务器端的私钥(key文件):opensslgenrsa-des3-outserver.key1024,运行时会提示输入密码,此密码用于加密key文件。运行opensslreq-new-keyserver.key-outserver.csr,生成CertificateSigningRequest(CSR),生成的csr文件交给CA签名后形成服务端自己的证书。屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可。对客户端也作同样的命令生成key及csr文件:opensslgenrsa-des3-outclient.key1024opensslreq-new-keyclient.key-outclient.csr按照提示输入相关信息,这里要注意信息的前五项(包括CountryName、StateName、city、company、section、)要和服务器端、CA保持相同,而后两项CommonName、Email不能完全一致,否则会导致证书签名失败。生成CA的key文件:opensslgenrsa-des3-outca.key1024再生成CA自签名的证书:opensslreq-new-x509-keyca.key-outca.crt用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:实验指导书上写的是用用mod_ssl中的sign.sh脚本进行签名,但是解压出来的openssl目录中没有找到mod_ssl,参考网上资料得知,对证书的签名可以用OpenSSLca命令来完成,具体命令:服务器端证书签名:Opensslca-inserver.csr-outserver.crt-certca.crt-keyfileca.key-configf客户端证书签名:Opensslca-inclient.csr-outclient.crt-certca.crt-keyfileca.key-configf如图,执行到此步时分别输入两次“y”即可完成对证书的签名,最终分别生成server.crt和client.crt。客户端和服务器端代码的编写程序分为两部分,客户端和服务器端,我们的目的是利用SSL/TLS的特性保证通信双方能够互相验证对方身份(真实性),并保证数据的完整性、私密性。1.客户端程序的框架为:/*生成一个SSL结构*/meth=SSLv23_client_method();ctx=SSL_CTX_new(meth);ssl=SSL_new(ctx);/*下面是正常的socket过程*/fd=socket();connect();/*把建立好的socket和SSL结构联系起来*/SSL_set_fd(ssl,fd);/*SSL的握手过程*/SSL_connect(ssl);/*接下来用SSL_write(),SSL_read()代替原有的write(),read()即可*/SSL_write(ssl,"Helloworld",strlen("HelloWorld!"));2.服务端程序的框架为:/*生成一个SSL结构*/meth=SSLv23_server_method();ctx=SSL_CTX_new(meth);ssl=SSL_new(ctx);/*下面是正常的socket过程*/fd=socket();bind();listen();accept();/*把建立好的socket和SSL结构联系起来*/SSL_set_fd(ssl,fd);/*SSL的握手过程*/SSL_connect(ssl);/*接下来用SSL_write(),SSL_read()代替原有的write(),read()即可*/SSL_read(ssl,buf,sizeof(buf));对程序来说,openssl将整个握手过程用一对函数体现,即客户端的SSL_connect和服务端的SSL_accept.而后的应用层数据交换则用SSL_read和SSL_write来完成。四程序运行结果说明进行保密通信的验证有两种方式,一种需要用到所生成的证书文件进行双向认证,代码的编写是参考网络资料,另一种是直接利用分割出来的公钥和私钥进行单向认证,代码来自对openssl压缩包中实例文件的修改。因没有进行程序界面的设计,运行程序时要从命令行窗口执行,服务器端先运行,然后再运行客户端,查看结果。直接利用公钥和私钥文件进行验证的程序截图:运行服务器端并输入密码1234:运行客户端:因未安装相关证书,因此显示“Clientdoesnothavecertificate.”但程序的执行流程展示出保密通信的过程。利用证书文件的程序执行结果:运行服务器端:运行客户端:五心得体会通过本次课程设计,对openSSL的运行机制有了更深入的了解。对网络安全中数据加密和身份认证有了深入的学习,强化了自己日常生活中使用电子商务交易的安全理念。另外通过编写C/S架构加密认证的聊天程序,也对网络编程的相关知识进行了强化。由于程序是参考一个linux操作系统下的编写而成,对windows和linux程序的区别有了一定认识。在程序调试方面由于用到一些新的库文件以及文件头,对VC的目录架构也有了更清楚的认识。六附录客户端代码:/*****************************************************************************SSL/TLS客户端程序WIN32版(以demos/cli.cpp为基础)*需要用到动态连接库libeay32.dll,ssleay.dll,*同时在setting中加入ws2_32.liblibeay32.libssleay32.lib,*以上库文件在编译openssl后可在out32dll目录下找到,*所需证书文件请参照<<利用Openssl生成证书文件>>自行生成*****************************************************************************/#include<stdio.h>#include<stdlib.h>#include<memory.h>#include<errno.h>#include<sys/types.h>#include<winsock2.h>#include"openssl/rsa.h"#include"openssl/crypto.h"#include"openssl/x509.h"#include"openssl/pem.h"#include"openssl/ssl.h"#include"openssl/err.h"#include"openssl/rand.h"/*所有需要的参数信息都在此处以#define的形式提供*/#defineCERTF"client.crt"/*客户端的证书(需经CA签名)*/#defineKEYF"client.key"/*客户端的私钥(建议加密存储)*/#defineCACERT"ca.crt"/*CA的证书*/#definePORT1111/*服务端的端口*/#defineSERVER_ADDR""/*服务段的IP地址*///检查错误#defineCHK_NULL(x)if((x)==NULL){exit(-1);}#defineCHK_ERR(err,s)if((err)==-1){perror(s);exit(-2);}#defineCHK_SSL(err)if((err)==-1){ERR_print_errors_fp(stderr);exit(-3);}intmain(void){interr;intsd;structsockaddr_insa;SSL_CTX*ctx;SSL*ssl;X509*server_cert;char*str;charbuf[4096];SSL_METHOD*meth;intseed_int[100];/*存放随机序列*/ inti=0; //随机种子编号WSADATAwsaData; //获取SOCKET版本(2.2)if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("WSAStartup()fail:%d\n",GetLastError());return-1;}OpenSSL_add_ssl_algorithms();/*初始化,加载算法*/SSL_load_error_strings();/*加载错误信息,为打印调试信息作准备*/meth=TLSv1_client_method();/*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/ctx=SSL_CTX_new(meth);CHK_NULL(ctx);SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);/*验证对方*/SSL_CTX_load_verify_locations(ctx,CACERT,NULL);/*若验证,则放置CA证书*///加载自己的证书client.crtif(SSL_CTX_use_certificate_file(ctx,CERTF,SSL_FILETYPE_PEM)<=0){ERR_print_errors_fp(stderr);exit(-2);}//加载自己的密钥文件client.keyif(SSL_CTX_use_PrivateKey_file(ctx,KEYF,SSL_FILETYPE_PEM)<=0){ERR_print_errors_fp(stderr);exit(-3);}//验证验证密钥与证书是否配对if(!SSL_CTX_check_private_key(ctx)){printf("Privatekeydoesnotmatchthecertificatepublickey\n");exit(-4);}/*构建随机数生成机制,WIN32平台必需*/srand((unsigned)time(NULL));//以时间为种子for(;i<100;i++)seed_int[i]=rand();RAND_seed(seed_int,sizeof(seed_int));/*以下是正常的TCPsocket建立过程*/printf("Begintcpsocket...\n");sd=socket(AF_INET,SOCK_STREAM,0);CHK_ERR(sd,"socket对象生成失败!\n");memset(&sa,'/0',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,"connectsocket连接失败!\n");/*TCP连接已建立,开始SSL握手过程*/printf("TCP连接成功建立,正在进行SSL握手...\n");ssl=SSL_new(ctx);//建立SSLCHK_NULL(ssl);SSL_set_fd(ssl,sd);//关联SSL与SOCKETerr=SSL_connect(ssl);//用SSL连接ServerCHK_SSL(err);/*打印所有加密算法的信息(可选)*/printf("本次SSL连接使用%s加密算法.\n",SSL_get_cipher(ssl));/*得到服务端的证书并打印些信息(可选)*/server_cert=SSL_get_peer_certificate(ssl);CHK_NULL(server_cert);printf("服务端证书信息:\n");str=X509_NAME_oneline(X509_get_subject_name(server_cert),0,0);CHK_NULL(str);printf("\t颁发给:%s\t",str);free(str);str=X509_NAME_oneline(X509_get_issuer_name(server_cert),0,0);CHK_NULL(str);printf("\t颁发者:%s\t",str);free(str);X509_free(server_cert);/*如不需要,则将证书释放*//*数据交换开始,用SSL_write,SSL_read代替write,read*/printf("证书验证成功,开始和服务器进行数据交换...\n");//发送消息err=SSL_write(ssl,"HelloServer!",strlen("HelloServer!"));CHK_SSL(err);//接收消息err=SSL_read(ssl,buf,sizeof(buf)-1);CHK_SSL(err);buf[err]='/0';printf("服务端对您说:'%s'\n",buf);SSL_shutdown(ssl);/*sendSSL/TLSclose_notify*//*收尾工作*/shutdown(sd,2);SSL_free(ssl);SSL_CTX_free(ctx);return0;}服务端代码:/******************************************************************************SSL/TLS服务端程序WIN32版(以demos/server.cpp为基础)*需要用到动态连接库libeay32.dll,ssleay.dll,*同时在setting中加入ws2_32.liblibeay32.libssleay32.lib,*以上库文件在编译openssl后可在out32dll目录下找到,*所需证书文件请参照<<利用Openssl生成证书文件>>自行生成*****************************************************************************/#include<stdio.h>#include<stdlib.h>#include<memory.h>#include<errno.h>#include<sys/types.h>#include<winsock2.h>#include"openssl/rsa.h"#include"openssl/crypto.h"#include"openssl/x509.h"#include"openssl/pem.h"#include"openssl/ssl.h"#include"openssl/err.h"/*所有需要的参数信息都在此处以#define的形式提供*/#defineCERTF"server.crt"/*服务端的证书(需经CA签名)*/#defineKEYF"server.key"/*服务端的私钥(建议加密存储)*/#defineCACERT"ca.crt"/*CA的证书*/#definePORT1111/*准备绑定的端口*/#defineCHK_NULL(x)if((x)==NULL){exit(1);}#defineCHK_ERR(err,s)if((err)==-1){perror(s);exit(1);}#defineCHK_SSL(err)if((err)==-1){ERR_print_errors_fp(stderr);exit(2);}intmain(){interr;intlisten_sd;intsd;structsockaddr_insa_serv;structsockaddr_insa_cli;intclient_len;SSL_CTX*ctx;SSL*ssl;X509*client_cert;char*str;charbuf[4096];SSL_METHOD*meth;WSADATAwsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("WSAStartup()fail:%dn",GetLastError());return-1;}SSL_load_error_strings();/*为打印调试信息作准备*/OpenSSL_add_ssl_algorithms();/*初始化,加载算法*/meth=TLSv1_server_method();/*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/ctx=SSL_CTX_new(meth);CHK_NULL(ctx);SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);/*验证与否*/SSL_CTX_load_verify_locations(ctx,CACERT,NULL);/*若验证,则放置CA证书*///加载自己的证书文件if(SSL_CTX_use_certificate_file(ctx,CERTF,SSL_FILETYPE_PEM)<=0){ERR_print_errors_fp(stderr);exit(3);}//加载自己的密钥文件if(SSL_CTX_use_PrivateKey_file(ctx,KEYF,SSL_FILETYPE_PEM)<=0){ERR_print_errors_fp(stderr);exit(4);}//验证if(!SSL_CTX_check_private_key(ctx)){printf("Privatekeydoesnotmatchthecertificatepublickey\n");exit(5);}//选择安全通信协议SSL_CTX_set_cipher_list(ctx,"RC4-MD5");/*开始正常的TCPsocket过程*/printf("BeginTCPsocket...\n");listen_sd=socket(AF_INET,SOCK_STREAM,0);CHK_ERR(listen_sd,"socket");memset(&sa_serv,'/0',sizeof(sa_serv));sa_serv.sin_family=AF_INET;sa_serv.sin_addr.s_addr=INADDR_ANY;sa_serv.sin_port=htons(PORT);err=bind(listen_sd,(structsockaddr*)&sa_serv,sizeof(sa_serv));CHK_ERR(err,"bind");/*接受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("受到来自%s,port%d的TCP链接..\n",inet_ntoa(sa_cli.sin_addr),sa_cli.sin_port);/*TCP连接已
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版智能语音识别系统研发合同
- 2024年度债务转移及债务清偿监督合同范本3篇
- 2025年度智能建筑项目监理合同补充协议书3篇
- 2024年环保设备采购与安装承包合同
- 2025年度橱柜安装与售后服务标准合同范本3篇
- 2024年高端装备制造技术研发与转让合同
- 2024建筑节能改造工程合同
- 2024石材项目劳务输出与质量保障合同2篇
- 2025年度电子商务平台入驻商家合作协议范本3篇
- 2024版借款买房合同模板
- 私募股权投资基金绩效考核制度
- 老年康养活动策划方案
- 初三生活学习总结模板
- 2024年新课标培训2022年小学英语新课标学习培训课件
- 福建省福州市2023-2024学年高一上学期期末质量检测英语试题 含答案
- 2024-2025学年第一学期期中考试 初一语文 试卷
- 高中体育与健康人教版全一册 6.3 挺身式跳远 课件
- 软件平台运维技术方案2项目人员配备与人员管理方案
- 2024年道路运输企业两类人员安全考核试题库-下(判断题)
- 河南省道德与法治初二上学期期末试题与参考答案(2024-2025学年)
- JJF(京) 3029-2023 医用(硬性)内窥镜校准规范
评论
0/150
提交评论