版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、網(wǎng)絡安全綜合課程設計 基于SSL的C/S安全通信程序的實現(xiàn)實驗指導書專業(yè)實驗中心2013-7目 錄第一章、設計環(huán)境及目的91、實驗環(huán)境92、實驗目的9第二章、相關技術介紹101.CA102. OpenSSL103.Winsocket編譯原理11第三章、設計步驟與開發(fā)平臺的搭建131、環(huán)境搭建132、證書下載163、公私鑰分割21第四章、系統(tǒng)結構261、身份認證模塊設計方法262、 傳輸加密模塊設計方法28第五章、程序設計提示與測試291、初始化SSL證書292、啟動線程處理函數(shù)303、接收消息線程處理函數(shù)304、發(fā)送消息函數(shù)315、服務端程序的框架326、客戶端程序的框架347、測試結果示例3
2、6第一章、設計環(huán)境及目的1、實驗環(huán)境 Windowsxp,visualC+,UltraEdit,ActivePerl-11-MSWin32-x86-122208等工具軟件,并結合了openssl-0.9.7b等工具。2、實驗目的1) 熟悉計算機的加密和應用,熟悉Socket通信編程函數(shù),掌握TCP/IP協(xié)議的客服端、服務器模式的網(wǎng)絡編程。2) 了解openssl的編譯過程。3) 了解CA如何申請、下載和安裝。以及如何進行公私鑰分割。4) ActivePerl工具軟件的安裝及運用。5) 編譯,搭建Openssl開發(fā)環(huán)境。6) 綜合運用Socket編程和Openssl安全套接字編程建
3、立安全通信通道。 第二章、相關技術介紹1.CACA:CA是PKI系統(tǒng)中通信雙方都信任的實體,被稱為可信第三方(Trusted Third Party,簡稱TTP)。CA作為可信第三方的重要條件之一就是CA的行為具有非否認性。作為第三方而不是簡單的上級,就必須能讓信任者有追究自己責任的能力。CA通過證書證實他人的公鑰信息,證書上有CA的簽名。用戶如果因為信任證書而導致了損失,證書可以作為有效的證據(jù)用于追究CA的法律責任。正是因為CA愿意給出承擔責任的承諾,所以也被稱為可信第三方。在很多情況下,CA與用戶是相互獨立的實體,CA作為服務提供方,有可能因為服務質(zhì)量問題(例如,發(fā)布的公鑰數(shù)據(jù)有錯誤)而給
4、用戶帶來損失。證書中綁定了公鑰數(shù)據(jù)、和相應私鑰擁有者的身份信息,并帶有CA的數(shù)字簽名。證書中也包含了CA的名稱,以便于依賴方找到CA的公鑰、驗證證書上的數(shù)字簽名。1) CA的層級結構: CA建立自上而下的信任鏈,下級CA信任上級CA,下級CA由上級CA頒發(fā)證書并認證。 2) CA提供的服務: 頒發(fā)證書、廢除證書、更新證書、驗證證書、管理密鑰。2. OpenSSLOpenSSL:為網(wǎng)絡通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協(xié)議,并提供了豐富的應用程序供測試或其它目的使用。利用OpenSSL開發(fā)包編寫建立在SSL上的C/S程序,包含客戶
5、端和服務器端程序。OpenSSL采用C語言作為開發(fā)語言,這使得OpenSSL具有優(yōu)秀的跨平臺性能,這對于廣大技術人員來說是一件非常美妙的事情,可以在不同的平臺使用同樣熟悉的東西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平臺,這使得OpenSSL具有廣泛的適用性。3.Winsocket編譯原理Windows Sockets接口是TCP/IP網(wǎng)絡最為通用API(應用程序接口),已成為Windows網(wǎng)絡編程的事實上的標準。它以Unix中流行的Socket接口為范例定義了一套Microsoft Windows下網(wǎng)絡編程接口函數(shù)庫。它不僅包含了人們所熟悉的Berkeley
6、Socket風格的庫函數(shù);也包含了一組針對Windows的擴展庫函數(shù),以使程序員能充分地利用Windows消息驅(qū)動機制進行編程。SOCKET實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有SOCKET接口的計算機通信。應用程序在網(wǎng)絡上傳輸,接收的信息都通過這個SOCKET接口來實現(xiàn)。在應用開發(fā)中就像使用文件句柄一樣,可以對SOCKET句柄進行讀,寫操作。VC+對原來的WindowsSockets庫函數(shù)進行了一系列封裝,繼而產(chǎn)生了CAsynSocket、CSocket、CSocketFile等類,它們封裝著有關Socket的各種功能。在VC中進行WINSOCK的API編程開發(fā),需
7、要使用到下面三個文件:1) WINSOCK.H:這是WINSOCK API的頭文件。2) WSOCK32.LIB: WINSOCK API連接庫文件。在使用中,一點要把它作為項目的非缺省的連接庫包含到項目文件中去。3) WINSOCK.DLL:WINSOCK的動態(tài)連接庫??偟膩碚f,使用SOCKET接口(面向連接或無連接)進行網(wǎng)絡通信時,必須按下面簡單的四步進行處理:1) 程序必須建立一個 SOCKET。2) 程序必須按要求配置此SOCKET。也就是說,程序要么將此SOCKET連接到遠方的主機上,要么給此SOCKET指定一個本地協(xié)議端口。3) 程序必須按要求通過此SOCKET發(fā)送和接收數(shù)據(jù)。4)
8、 程序必須關閉此SOCKET。程序分為兩部分:客戶端和服務器端,我們的目的是利用SSL/TLS的特性保證通信雙方能夠互相驗證對方身份(真實性),并保證數(shù)據(jù)的完整性, 私密性.服務器和客服端程序框架的建立,另外重點是證書文件的生成。本次編程基本上是改造的openssl自帶的demos目錄下的cli.cpp,serv.cpp文件,做了一些修改,并增加了一些功能。第三章、設計步驟與開發(fā)平臺的搭建1、環(huán)境搭建1) 安裝ActivePerl-29-MSWin32-x86-multi-thread. 2) 打開控制臺程序,在openssl解壓后的目錄下執(zhí)行Perl Configure VC-
9、WIN32命令,注意,一定要在這個目錄下執(zhí)行該命令,否則找不到Configure文件,當然,你也可以指定完整的Configure文件路徑。順利通過。3) 根據(jù)openssl的幫助說明,在解壓目錄下執(zhí)行msdo_masm(和ms_do_ms)命令,成功通過。4) 配置VC環(huán)境變量,我在相同的控制臺程序下轉到VC所在目錄下的vc98bin目錄,執(zhí)行vcvars32批處理命令,設置VC的環(huán)境變量,然后再轉到openssl解壓包的根目錄下。5) 在openssl解壓目錄下執(zhí)行nmake -f msntdll.mak,如果沒有錯誤,就完成編譯了。輸出的文件在out32dll里面,包括應用程序的可執(zhí)行文件
10、、兩個Lib文件和兩個dll文件。 2、證書下載1) 訪問/certsrv申請證書、導出包含公私鑰的pfx文件。申請證書-高級-使用表格CA-標記為密鑰可導出(導出到文件-不要選擇)-安裝證書。2) IE-internet選項-內(nèi)容-證書-選中剛才安裝的證書,導出-是,導出私鑰-(缺?。┫乱徊?密碼(1234)-文件名(mykey.pfx).3、公私鑰分割注:紅色字體為系統(tǒng)提示,黑色字體為輸入或輸入的說明。1) 運行opensslE:openssout32dllopenssl2) 在openssl環(huán)境下運行。Opensslpkcs12 in d:okmyke
11、y.pfx out d:okmypem.pemEnter Import Password:此處輸入mykey.pfx的密碼“1234”MAC verified okEnter PEM pass phrase:此處輸入保護私鑰的密碼(注:也就是服務器端加載私鑰時要輸入的密碼)Verifying- Enter PEM pass phrase:驗證輸入Opensslquit3) 經(jīng)過第2步所生成的mypem.pem文件即包含公鑰又包含私鑰,但和mykey.pfx比較編碼格式發(fā)生了變化。分割過程:(1) Ultraedit打開mypem.pem。(2) 找到-BEGIN RSA PRIVATE KEY
12、-.-END RSA PRIVATE KEY-將這一部分(如圖1的陰影部分)內(nèi)容復制并另存為chkey.pem,即私鑰文件。圖14) 找到 -BEGIN CERTIFICATE-.-END CERTIFICATE- 將這一部分(如下圖的陰影部分)內(nèi)容復制并另存為chcert.pem,即公鑰鑰文件。第四章、系統(tǒng)結構通信系統(tǒng)需要由以下幾個部分組成:SSL加密通信、身份認證、證書管理。服務器客戶端信息加密傳輸身份認證證書管理安全通信系統(tǒng)結構1、身份認證模塊設計方法1) 證書與密鑰交換算法的選擇在SSL協(xié)議中證書的一個重要作用就是參與通信雙方對密鑰交換算法的選擇。在通信雙方開始進行算法協(xié)商時,SSL客
13、戶端在它發(fā)給SSL服務端的客戶問候消息中列出了所有客戶端支持的加密算法套件,每個加密套件中有一項標識了該加密套件支持的密鑰交換算法,選擇什么的密鑰交換算法由SSL服務端所擁有的證書決定。SSL服務端在對客戶端發(fā)來的加密套件進行選擇時,要通過它擁有的證書類型來決定是否該選擇該加密套件。我們使用兩種方法來劃分證書的類型,第一種是依據(jù)證書的用途,證書從其用途可以分為加密證書和簽名證書等,它們分別指定證書在使用中的不同用途,加密證書用來加密數(shù)據(jù),保證數(shù)據(jù)的保密性,簽名證書用來對數(shù)據(jù)進行簽名,保證數(shù)據(jù)的不可抵賴性。第二種劃分方法是依據(jù)證書綁定的公鑰類型,目前我們的證書中可以綁定下列公鑰加密算法的公鑰:R
14、SA、DH、ECC和DSS。在SSL中這兩種證書類型的劃分方法都要考慮到,因為它們從不同的方面影響著SSL對密鑰交換算法的選擇,進而決定了SSL的握手過程。下面我們介紹一下在SSL握手過程中進行算法協(xié)商時證書所起的作用。當SSL客戶端發(fā)起SSL連接請求時,它向SSL服務端發(fā)送客戶問候消息,客戶問候消息中包含有客戶端支持的所有加密套件,加密套件中包含有該套件支持的密鑰交換算法。SSL服務端在接收到客戶端發(fā)來的客戶問候消息后,它要從客戶端支持的加密套件組中選擇一個加密套件,其中一個重要依據(jù)就是服務端擁有的證書。如果待選擇的加密套件中有SSL RSA WITH IDEA CBC SHA,它要求服務端
15、必須提供RSA證書用于鑒別身份和交換密鑰,此時如果SSL服務端有RSA證書,它就可以選擇該加密套件,由于RSA證書中已經(jīng)包含了密鑰交換算法的參數(shù),服務端就不需要在向客戶端發(fā)送密鑰交換消息??蛻舳嗽谂c服務端進行密鑰交換時,就是利用該證書中綁定的公鑰來加密預加密密鑰。如果服務端沒有RSA證書,而只有支持DSS算法的簽名證書,它就有可能選擇另一個待選擇的加密套件SSL DH DSS WITH 3DES EDE CBC SHA,該加密套件要求密鑰交換采用DH算法,同時必須對服務端進行身份鑒別,因為服務端證書消息中的DSS證書只能供客戶端進行身份認證,所以DH算法的參數(shù)需要通過服務端密鑰交換消息傳給客戶
16、端。2) 證書與身份認證證書的另一個重要作用就是身份認證?;谧C書的身份認證過程如下:SSL服務端向SSL客戶端發(fā)送證書消息,隨后,SSL服務端再向客戶端發(fā)送證書請求消息,該消息由兩部分組成,第一部分是請求的證書類型,第二部分是請求證書的發(fā)證者CA的名字,也就是服務端信任的CA的名字。SSL客戶端在接收到SSL服務端發(fā)來的證書消息后,首先認證服務端證書,如果認證通過,則繼續(xù)接收后面的消息,否則將向服務端發(fā)送警告消息,并終止連接。當SSL客戶端接收到服務端發(fā)來的證書請求消息后,需要向服務端發(fā)送客戶證書消息,客戶證書消息中包含有客戶端證書,該證書必須滿足服務端在證書請求中列出的條件,即該證書必須是
17、服務端信任的CA簽發(fā)的。在上面我們提到在SSL服務端證書和客戶端證書都分別包含在證書消息中,實際上在證書消息中不只是一個證書,而是個證書鏈。證書鏈由最終實體證書到根以證書的一系列順序排列的證書組成,對證書的認證上就是對該證書鏈進行認證。在SSL協(xié)議中并沒有規(guī)定具體的認證證書的方法,因此在我們對SSL協(xié)議進行實現(xiàn)的過程中必須從可行的認證方法中選擇一種有效和安全的認證方法。我們對證書鏈的認證主要是認證證書鏈中每個證書是否是被其上一級以所簽發(fā)的,這個過程可以沿著證書鏈從實體證書一直到證書鏈的末端(即根證書)來順序進行。2、 傳輸加密模塊設計方法采用SSL協(xié)議的公開實現(xiàn)OpemSSL提供安全的傳輸機制
18、,應用程序數(shù)據(jù)的傳輸過程為:1) 程序把應用數(shù)據(jù)提交給本地的SSL。2) 發(fā)送端的SSL先用對應連接的散列算法對應用數(shù)據(jù)進行散列,得到一個應用數(shù)據(jù)的散列值。3) 散列值和應用數(shù)據(jù)一起用加密算法加密。4) 密文通過網(wǎng)絡傳給對方。5) 接收方的SSL用相同的算法對密文解密,得到明文。6) 接收方的SSL用相同的散列算法對明文中的應用數(shù)據(jù)散列。7) 計算得到的散列值與明文中的散列值比較,如果一致,明文中的應用數(shù)據(jù)有效,SSL把應用數(shù)據(jù)上交給接收方的應用層;否則就丟棄數(shù)據(jù),并向?qū)Ψ桨l(fā)出報警信息。嚴重的錯誤有可能引起再次的協(xié)商或連接中斷。SSL通信模型為標準的CS結構,除了在TCP層之上進行傳輸之外,與
19、一般的通信沒有明顯區(qū)別,其服務器端的基本程序結構如下:1) 在使用OpemSSL前,必須先對OpenSSL進行初始化。2) 一次SSL連接會話一般要先申請一個SSL環(huán)境,創(chuàng)建本次會話所使用的協(xié)議:需要注意的是客戶端和服務器需要使用相同的協(xié)議,然后申請SSL會話的環(huán)境,使用不同的協(xié)議進行會話,其環(huán)境也不同。根據(jù)自己的需要設置SSL握手階段證書的驗證方式和加載自己的證書。3) SSL使用TCP協(xié)議,需要把SSL綁定到已經(jīng)連接的套接字上。4) 接下來是SSL握手。5) 握手成功之后,就可以進行通信了,使用SSLread和SSLwrite讀寫SSL套接字代替?zhèn)鹘y(tǒng)的read和write,使用SSLacc
20、ept代替?zhèn)鹘y(tǒng)的accept調(diào)用。6) 通信結束,需要釋放前面申請的SSL資源。第五章、程序設計提示與測試1、初始化SSL證書1)初始化Openssl算法庫及協(xié)議算法SSL_load_error_strings();SSLeay_add_ssl_algorithms();SSL_METHOD *meth;meth = SSLv23_server_method();/使用SSL V2或V3協(xié)議ctx = SSL_CTX_new (meth);/初始化SSL上下文2)驗證證書(此為驗證客戶端)SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER|SSL_VERIFY_FAI
21、L_IF_NO_PEER_CERT,verify_callback_server);/驗證客戶端SSL_CTX_set_verify(ctx,SSL_VERIFY_FAIL_IF_NO_PEER_CERT,0); /不驗證客戶端SSL_CTX_load_verify_locations(ctx,ROOTCERTF,NULL); /若驗證,則放置CA證書SSL_CTX_set_verify_depth(ctx,1); SSL_CTX_set_cipher_list(ctx,RC4-MD5); 3)設置證書、私鑰及驗證(此為設置服務端)if (SSL_CTX_use_certificate_fil
22、e(ctx, CERTF, SSL_FILETYPE_PEM) = 0) return FALSE;/設子服務器證書if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) GetSafeHwnd(),WM_STATE_MSG,0,(long )msg);return;2)初始化sockaddr_in結構體memset (&sa_serv, 0, sizeof(sa_serv);sa_serv.sin_family = AF_INET;sa_serv.sin_addr.s_addr = INADDR_ANY;sa_serv.sin
23、_port = htons (port);3)啟動接收連接線程for(;)hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)AcceptThreadProc,(void *)listen_sd, 0 ,&idThread);/等待該線程執(zhí)行完畢,開啟下一個線程,繼續(xù)等待接收連接。WaitForSingleObject(hd, INFINITE); 3、接收消息線程處理函數(shù)1)調(diào)用select異步等待消息for(;)FD_ZERO(&writeFds);FD_ZERO(&readFds);FD_ZERO(&excFds);FD_SET(clientFd
24、, &readFds);/異步的方式等待客戶端數(shù)據(jù)int nfd = select(maxFd + 1, &readFds, &writeFds, &excFds, NULL);2)接收服務器消息if(FD_ISSET(sd, &readFds)/接收服務器消息int len = SSL_read(ssl,buffer,sizeof(buffer);if(len GetSafeHwnd(),WM_STATE_MSG,sd,(long )msg);return;提取客戶端數(shù)據(jù)if(FD_ISSET(clientFd, &readFds)/有客戶端數(shù)據(jù)需要讀取/接收客戶端數(shù)據(jù)len = SSL_r
25、ead(clientDesc.ssl,buffer,sizeof(buffer);if(len GetSafeHwnd(),WM_STATE_MSG,clientFd,(long )msg);return;bufferlen=0;char *msg1 = (char *)malloc(len +1);strcpy(msg1,buffer);/發(fā)送WM_CLIENT_MSG消息到主窗體,把接收到的消息顯示到列表框SendMessage(AfxGetMainWnd()-GetSafeHwnd(),WM_CLIENT_MSG,clientFd,(long )msg1);4、發(fā)送消息函數(shù)1)服務器發(fā)送
26、消息void CServerDlg:OnSend() UpdateData();/遍續(xù)所有已經(jīng)鏈接客戶端,發(fā)送消息for(int i=0;iSetActiveWindow();2)服務端發(fā)送消息void CClientDlg:OnSend() UpdateData();if(client.fd !=0)/發(fā)送消息SSL_write(client.ssl,m_str.GetBuffer(0),m_str.GetLength();m_str.ReleaseBuffer();elsereturn;5、服務端程序的框架/*生成一個SSL結構并初始化*/SSL_load_error_strings();
27、SSLeay_add_ssl_algorithms();meth = SSLv23_server_method();ctx = SSL_CTX_new (meth);/*正常的socket過程*/為接收客戶端連接準備服務器端TCP socket連接. listen_sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(err, socket);memset (&sa_serv, 0, sizeof(sa_serv);/設置通信協(xié)議為TCP/IP協(xié)議sa_serv.sin_family = AF_INET;/設置接收IP地址為任意IPADDRsa_serv
28、.sin_addr.s_addr = INADDR_ANY;/設置server的端口號sa_serv.sin_port = htons (serverport); /綁定端口號err = bind(listen_sd, (struct sockaddr*) &sa_serv,sizeof (sa_serv); CHK_ERR(err, bind); /開始監(jiān)聽TCP連接err = listen (listen_sd, 5); CHK_ERR(err, listen);client_len = sizeof(sa_cli);/接收到一個客戶端的連接sd = accept (listen_sd,
29、(struct sockaddr*) &sa_cli, &client_len); CHK_ERR(sd, accept);/關閉TCP連接closesocket (listen_sd);printf (Connection from %lx, port %xn,sa_cli.sin_addr.s_addr, sa_cli.sin_port);/*把建立好的socket和SSL結構聯(lián)系起來*/TCP連接已經(jīng)準備好,開始啟用server端的SSL. ssl = SSL_new (ctx); CHK_NULL(ssl);SSL_set_fd (ssl, sd);err = SSL_accept (ssl); CHK_SSL(err);/*接下來用SSL_write(), SSL_read()代替原有的write(),read()即可*/SSL_read (ssl, buf, sizeof(buf);6、客戶端程序的框架/*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版存量買賣合同二零二五年度新型建筑材料3篇
- 2025年智慧城市規(guī)劃設計與應用技術服務合同3篇
- 2025年度人工智能教育機構勞動合同協(xié)議書范本3篇
- 2025年70米煙囪拆除工程施工用電安全管理與監(jiān)督合同3篇
- 2025年美甲美睫店兼職美甲師合作協(xié)議
- 2025年度體育賽事活動場地租用及保障服務協(xié)議3篇
- 二零二五年度廠房租賃安全生產(chǎn)責任書3篇
- 2025年度智能建筑項目分包勞務協(xié)議補充合同
- 2025年建筑工程施工合同模板:綠色建筑性能檢測與認證3篇
- 二零二五年度汽車維修配件供應鏈合同樣本3篇
- 服務器報價表
- 2025年高考化學試題分析及復習策略講座
- 世界近代史-對接選擇性必修 課件-高考統(tǒng)編版歷史一輪復習
- 2024-2029年中國制漿系統(tǒng)行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報告
- 大門封條模板
- 【“凡爾賽”網(wǎng)絡流行語的形成及傳播研究11000字(論文)】
- ppr管件注塑工藝
- 液化氣站其他危險和有害因素辨識及分析
- 高中語文教學課例《勸學》課程思政核心素養(yǎng)教學設計及總結反思
- 中國農(nóng)業(yè)銀行小微企業(yè)信貸業(yè)務貸后管理辦法規(guī)定
- 市政道路建設工程竣工驗收質(zhì)量自評報告
評論
0/150
提交評論