網(wǎng)絡(luò)安全課程設(shè)計報告_第1頁
網(wǎng)絡(luò)安全課程設(shè)計報告_第2頁
網(wǎng)絡(luò)安全課程設(shè)計報告_第3頁
網(wǎng)絡(luò)安全課程設(shè)計報告_第4頁
網(wǎng)絡(luò)安全課程設(shè)計報告_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

目錄TOC\o\h\z一概述 21. 課程設(shè)計的目的 22. 課程設(shè)計的要求 23. 課程設(shè)計環(huán)境 2二總體方案設(shè)計 2三詳細設(shè)計 21. OpenSSL的安裝和編譯 22. 公私鑰的分割 43. 證書文件的生成 44. 客戶端和服務(wù)器端代碼的編寫 8四程序運行結(jié)果說明 10五心得體會 11六附錄 111. 客戶端代碼: 112. 服務(wù)端代碼: 15

一概述課程設(shè)計的目的本課程設(shè)計的目的是,使學生掌握CA認證的知識,并能夠使用證書完成用戶身份的認證和通信過程中的安全保密。課程設(shè)計的要求利用openssl開發(fā)包編寫建立在SSL上的C/S程序,包含客戶端和服務(wù)器端程序。要求每組不超過兩人,協(xié)作完成程序和課程設(shè)計報告。課程設(shè)計環(huán)境預裝有VC++6.0的Windows操作系統(tǒng)二總體方案設(shè)計Windows下進行OpenSSL編程的主要步驟:訪問/certsrv申請證書、導出包含公私鑰的pfx文件;安裝ActivePerl-11-MSWin32-x86-122208.msi。閱讀openssl開發(fā)包中的install.w32、編譯openssl;閱讀相關(guān)文檔,熟悉OpenSSL編程接口,編寫server和client端代碼;將所需要的文件放到源代碼目錄,調(diào)試并運行程序,驗證進行安全通信的過程及身份認證方式。三詳細設(shè)計OpenSSL的安裝和編譯首先按提示安裝ActivePerl-11-MSWin32-x86-122208.msi,解壓openssl壓縮包。點擊“開始”——“運行”輸入cmd并回車打開命令行窗口。分別執(zhí)行命令PerlConfigureVC-WIN32和ms\do_masm,截圖如下。轉(zhuǎn)到VC所在目錄下的vc98\bin目錄,執(zhí)行vcvars32批處理命令,設(shè)置VC的環(huán)境變量,然后再轉(zhuǎn)到openssl解壓包的根目錄下。在openssl解壓目錄下執(zhí)行nmake-fms\ntdll.mak,等待編譯完成。輸出的文件在out32dll里面,包括應(yīng)用程序的可執(zhí)行文件、兩個Lib文件和兩個dll文件,生成的文件用于C/S程序的執(zhí)行。公私鑰的分割從IE導出的pfx文件,文件名為mykey.pfx,密碼為“1234”;進入OpenSSL目錄,在openssl環(huán)境下運行命令pkcs12–ind:\ok\mykey.pfx–outd:\ok\mypem.pem;Ultraedit打開mypem.pem,找到BEGINRSAPRIVATEKEY…….ENDRSAPRIVATEKEY將這一部分內(nèi)容復制并另存為prikey.pem,即私鑰文件。找到BEGINCERTIFICATE……….ENDCERTIFICATE將這一部分內(nèi)容復制并另存為cerkey.pem,即公鑰鑰文件。 因服務(wù)器原因,公私鑰分割的過程沒有進行驗證,而是直接利用分割好的文件進行后續(xù)設(shè)計。證書文件的生成這一步需要生成的文件有客戶端證書client.crt、服務(wù)器端證書server.crt、CA證書ca.crt。具體執(zhí)行步驟如下:首先要生成服務(wù)器端的私鑰(key文件):opensslgenrsa-des3-outserver.key1024,運行時會提示輸入密碼,此密碼用于加密key文件。運行opensslreq-new-keyserver.key-outserver.csr,生成CertificateSigningRequest(CSR),生成的csr文件交給CA簽名后形成服務(wù)端自己的證書。屏幕上將有提示,依照其指示一步一步輸入要求的個人信息即可。對客戶端也作同樣的命令生成key及csr文件:opensslgenrsa-des3-outclient.key1024opensslreq-new-keyclient.key-outclient.csr按照提示輸入相關(guān)信息,這里要注意信息的前五項(包括CountryName、StateName、city、company、section、)要和服務(wù)器端、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,參考網(wǎng)上資料得知,對證書的簽名可以用OpenSSLca命令來完成,具體命令:服務(wù)器端證書簽名:Opensslca-inserver.csr-outserver.crt-certca.crt-keyfileca.key-configf客戶端證書簽名:Opensslca-inclient.csr-outclient.crt-certca.crt-keyfileca.key-configf如圖,執(zhí)行到此步時分別輸入兩次“y”即可完成對證書的簽名,最終分別生成server.crt和client.crt。客戶端和服務(wù)器端代碼的編寫程序分為兩部分,客戶端和服務(wù)器端,我們的目的是利用SSL/TLS的特性保證通信雙方能夠互相驗證對方身份(真實性),并保證數(shù)據(jù)的完整性、私密性。1.客戶端程序的框架為:/*生成一個SSL結(jié)構(gòu)*/meth=SSLv23_client_method();ctx=SSL_CTX_new(meth);ssl=SSL_new(ctx);/*下面是正常的socket過程*/fd=socket();connect();/*把建立好的socket和SSL結(jié)構(gòu)聯(lián)系起來*/SSL_set_fd(ssl,fd);/*SSL的握手過程*/SSL_connect(ssl);/*接下來用SSL_write(),SSL_read()代替原有的write(),read()即可*/SSL_write(ssl,"Helloworld",strlen("HelloWorld!"));2.服務(wù)端程序的框架為:/*生成一個SSL結(jié)構(gòu)*/meth=SSLv23_server_method();ctx=SSL_CTX_new(meth);ssl=SSL_new(ctx);/*下面是正常的socket過程*/fd=socket();bind();listen();accept();/*把建立好的socket和SSL結(jié)構(gòu)聯(lián)系起來*/SSL_set_fd(ssl,fd);/*SSL的握手過程*/SSL_connect(ssl);/*接下來用SSL_write(),SSL_read()代替原有的write(),read()即可*/SSL_read(ssl,buf,sizeof(buf));對程序來說,openssl將整個握手過程用一對函數(shù)體現(xiàn),即客戶端的SSL_connect和服務(wù)端的SSL_accept.而后的應(yīng)用層數(shù)據(jù)交換則用SSL_read和SSL_write來完成。四程序運行結(jié)果說明進行保密通信的驗證有兩種方式,一種需要用到所生成的證書文件進行雙向認證,代碼的編寫是參考網(wǎng)絡(luò)資料,另一種是直接利用分割出來的公鑰和私鑰進行單向認證,代碼來自對openssl壓縮包中實例文件的修改。因沒有進行程序界面的設(shè)計,運行程序時要從命令行窗口執(zhí)行,服務(wù)器端先運行,然后再運行客戶端,查看結(jié)果。直接利用公鑰和私鑰文件進行驗證的程序截圖:運行服務(wù)器端并輸入密碼1234:運行客戶端:因未安裝相關(guān)證書,因此顯示“Clientdoesnothavecertificate.”但程序的執(zhí)行流程展示出保密通信的過程。利用證書文件的程序執(zhí)行結(jié)果:運行服務(wù)器端:運行客戶端:五心得體會通過本次課程設(shè)計,對openSSL的運行機制有了更深入的了解。對網(wǎng)絡(luò)安全中數(shù)據(jù)加密和身份認證有了深入的學習,強化了自己日常生活中使用電子商務(wù)交易的安全理念。另外通過編寫C/S架構(gòu)加密認證的聊天程序,也對網(wǎng)絡(luò)編程的相關(guān)知識進行了強化。由于程序是參考一個linux操作系統(tǒng)下的編寫而成,對windows和linux程序的區(qū)別有了一定認識。在程序調(diào)試方面由于用到一些新的庫文件以及文件頭,對VC的目錄架構(gòu)也有了更清楚的認識。六附錄客戶端代碼:/*****************************************************************************SSL/TLS客戶端程序WIN32版(以demos/cli.cpp為基礎(chǔ))*需要用到動態(tài)連接庫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"/*所有需要的參數(shù)信息都在此處以#define的形式提供*/#defineCERTF"client.crt"/*客戶端的證書(需經(jīng)CA簽名)*/#defineKEYF"client.key"/*客戶端的私鑰(建議加密存儲)*/#defineCACERT"ca.crt"/*CA的證書*/#definePORT1111/*服務(wù)端的端口*/#defineSERVER_ADDR""/*服務(wù)段的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();/*加載錯誤信息,為打印調(diào)試信息作準備*/meth=TLSv1_client_method();/*采用什么協(xié)議(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);}/*構(gòu)建隨機數(shù)生成機制,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);//關(guān)聯(lián)SSL與SOCKETerr=SSL_connect(ssl);//用SSL連接ServerCHK_SSL(err);/*打印所有加密算法的信息(可選)*/printf("本次SSL連接使用%s加密算法.\n",SSL_get_cipher(ssl));/*得到服務(wù)端的證書并打印些信息(可選)*/server_cert=SSL_get_peer_certificate(ssl);CHK_NULL(server_cert);printf("服務(wù)端證書信息:\n");str=X509_NAME_oneline(X509_get_subject_name(server_cert),0,0);CHK_NULL(str);printf("\t頒發(fā)給:%s\t",str);free(str);str=X509_NAME_oneline(X509_get_issuer_name(server_cert),0,0);CHK_NULL(str);printf("\t頒發(fā)者:%s\t",str);free(str);X509_free(server_cert);/*如不需要,則將證書釋放*//*數(shù)據(jù)交換開始,用SSL_write,SSL_read代替write,read*/printf("證書驗證成功,開始和服務(wù)器進行數(shù)據(jù)交換...\n");//發(fā)送消息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("服務(wù)端對您說:'%s'\n",buf);SSL_shutdown(ssl);/*sendSSL/TLSclose_notify*//*收尾工作*/shutdown(sd,2);SSL_free(ssl);SSL_CTX_free(ctx);return0;}服務(wù)端代碼:/******************************************************************************SSL/TLS服務(wù)端程序WIN32版(以demos/server.cpp為基礎(chǔ))*需要用到動態(tài)連接庫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"/*所有需要的參數(shù)信息都在此處以#define的形式提供*/#defineCERTF"server.crt"/*服務(wù)端的證書(需經(jīng)CA簽名)*/#defineKEYF"server.key"/*服務(wù)端的私鑰(建議加密存儲)*/#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();/*為打印調(diào)試信息作準備*/OpenSSL_add_ssl_algorithms();/*初始化,加載算法*/meth=TLSv1_server_method();/*采用什么協(xié)議(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);}//選擇安全通信協(xié)議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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論