




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、網絡安全綜合課程設計 基于SSL的C/S安全通信程序的實現實驗指導書專業實驗中心2013-7目 錄第一章、設計環境及目的91、實驗環境92、實驗目的9第二章、相關技術介紹101.CA102. OpenSSL103.Winsocket編譯原理11第三章、設計步驟與開發平臺的搭建131、環境搭建132、證書下載163、公私鑰分割21第四章、系統結構261、身份認證模塊設計方法262、 傳輸加密模塊設計方法28第五章、程序設計提示與測試291、初始化SSL證書292、啟動線程處理函數303、接收消息線程處理函數304、發送消息函數315、服務端程序的框架326、客戶端程序的框架347、測試結果示例3
2、6第一章、設計環境及目的1、實驗環境 Windowsxp,visualC+,UltraEdit,ActivePerl-11-MSWin32-x86-122208等工具軟件,并結合了openssl-0.9.7b等工具。2、實驗目的1) 熟悉計算機的加密和應用,熟悉Socket通信編程函數,掌握TCP/IP協議的客服端、服務器模式的網絡編程。2) 了解openssl的編譯過程。3) 了解CA如何申請、下載和安裝。以及如何進行公私鑰分割。4) ActivePerl工具軟件的安裝及運用。5) 編譯,搭建Openssl開發環境。6) 綜合運用Socket編程和Openssl安全套接字編程建
3、立安全通信通道。 第二章、相關技術介紹1.CACA:CA是PKI系統中通信雙方都信任的實體,被稱為可信第三方(Trusted Third Party,簡稱TTP)。CA作為可信第三方的重要條件之一就是CA的行為具有非否認性。作為第三方而不是簡單的上級,就必須能讓信任者有追究自己責任的能力。CA通過證書證實他人的公鑰信息,證書上有CA的簽名。用戶如果因為信任證書而導致了損失,證書可以作為有效的證據用于追究CA的法律責任。正是因為CA愿意給出承擔責任的承諾,所以也被稱為可信第三方。在很多情況下,CA與用戶是相互獨立的實體,CA作為服務提供方,有可能因為服務質量問題(例如,發布的公鑰數據有錯誤)而給
4、用戶帶來損失。證書中綁定了公鑰數據、和相應私鑰擁有者的身份信息,并帶有CA的數字簽名。證書中也包含了CA的名稱,以便于依賴方找到CA的公鑰、驗證證書上的數字簽名。1) CA的層級結構: CA建立自上而下的信任鏈,下級CA信任上級CA,下級CA由上級CA頒發證書并認證。 2) CA提供的服務: 頒發證書、廢除證書、更新證書、驗證證書、管理密鑰。2. OpenSSLOpenSSL:為網絡通信提供安全及數據完整性的一種安全協議,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協議,并提供了豐富的應用程序供測試或其它目的使用。利用OpenSSL開發包編寫建立在SSL上的C/S程序,包含客戶
5、端和服務器端程序。OpenSSL采用C語言作為開發語言,這使得OpenSSL具有優秀的跨平臺性能,這對于廣大技術人員來說是一件非常美妙的事情,可以在不同的平臺使用同樣熟悉的東西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平臺,這使得OpenSSL具有廣泛的適用性。3.Winsocket編譯原理Windows Sockets接口是TCP/IP網絡最為通用API(應用程序接口),已成為Windows網絡編程的事實上的標準。它以Unix中流行的Socket接口為范例定義了一套Microsoft Windows下網絡編程接口函數庫。它不僅包含了人們所熟悉的Berkeley
6、Socket風格的庫函數;也包含了一組針對Windows的擴展庫函數,以使程序員能充分地利用Windows消息驅動機制進行編程。SOCKET實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有SOCKET接口的計算機通信。應用程序在網絡上傳輸,接收的信息都通過這個SOCKET接口來實現。在應用開發中就像使用文件句柄一樣,可以對SOCKET句柄進行讀,寫操作。VC+對原來的WindowsSockets庫函數進行了一系列封裝,繼而產生了CAsynSocket、CSocket、CSocketFile等類,它們封裝著有關Socket的各種功能。在VC中進行WINSOCK的API編程開發,需
7、要使用到下面三個文件:1) WINSOCK.H:這是WINSOCK API的頭文件。2) WSOCK32.LIB: WINSOCK API連接庫文件。在使用中,一點要把它作為項目的非缺省的連接庫包含到項目文件中去。3) WINSOCK.DLL:WINSOCK的動態連接庫。總的來說,使用SOCKET接口(面向連接或無連接)進行網絡通信時,必須按下面簡單的四步進行處理:1) 程序必須建立一個 SOCKET。2) 程序必須按要求配置此SOCKET。也就是說,程序要么將此SOCKET連接到遠方的主機上,要么給此SOCKET指定一個本地協議端口。3) 程序必須按要求通過此SOCKET發送和接收數據。4)
8、 程序必須關閉此SOCKET。程序分為兩部分:客戶端和服務器端,我們的目的是利用SSL/TLS的特性保證通信雙方能夠互相驗證對方身份(真實性),并保證數據的完整性, 私密性.服務器和客服端程序框架的建立,另外重點是證書文件的生成。本次編程基本上是改造的openssl自帶的demos目錄下的cli.cpp,serv.cpp文件,做了一些修改,并增加了一些功能。第三章、設計步驟與開發平臺的搭建1、環境搭建1) 安裝ActivePerl-29-MSWin32-x86-multi-thread. 2) 打開控制臺程序,在openssl解壓后的目錄下執行Perl Configure VC-
9、WIN32命令,注意,一定要在這個目錄下執行該命令,否則找不到Configure文件,當然,你也可以指定完整的Configure文件路徑。順利通過。3) 根據openssl的幫助說明,在解壓目錄下執行msdo_masm(和ms_do_ms)命令,成功通過。4) 配置VC環境變量,我在相同的控制臺程序下轉到VC所在目錄下的vc98bin目錄,執行vcvars32批處理命令,設置VC的環境變量,然后再轉到openssl解壓包的根目錄下。5) 在openssl解壓目錄下執行nmake -f msntdll.mak,如果沒有錯誤,就完成編譯了。輸出的文件在out32dll里面,包括應用程序的可執行文件
10、、兩個Lib文件和兩個dll文件。 2、證書下載1) 訪問/certsrv申請證書、導出包含公私鑰的pfx文件。申請證書-高級-使用表格CA-標記為密鑰可導出(導出到文件-不要選擇)-安裝證書。2) IE-internet選項-內容-證書-選中剛才安裝的證書,導出-是,導出私鑰-(缺省)下一步-密碼(1234)-文件名(mykey.pfx).3、公私鑰分割注:紅色字體為系統提示,黑色字體為輸入或輸入的說明。1) 運行opensslE:openssout32dllopenssl2) 在openssl環境下運行。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) 經過第2步所生成的mypem.pem文件即包含公鑰又包含私鑰,但和mykey.pfx比較編碼格式發生了變化。分割過程:(1) Ultraedit打開mypem.pem。(2) 找到-BEGIN RSA PRIVATE KEY
12、-.-END RSA PRIVATE KEY-將這一部分(如圖1的陰影部分)內容復制并另存為chkey.pem,即私鑰文件。圖14) 找到 -BEGIN CERTIFICATE-.-END CERTIFICATE- 將這一部分(如下圖的陰影部分)內容復制并另存為chcert.pem,即公鑰鑰文件。第四章、系統結構通信系統需要由以下幾個部分組成:SSL加密通信、身份認證、證書管理。服務器客戶端信息加密傳輸身份認證證書管理安全通信系統結構1、身份認證模塊設計方法1) 證書與密鑰交換算法的選擇在SSL協議中證書的一個重要作用就是參與通信雙方對密鑰交換算法的選擇。在通信雙方開始進行算法協商時,SSL客
13、戶端在它發給SSL服務端的客戶問候消息中列出了所有客戶端支持的加密算法套件,每個加密套件中有一項標識了該加密套件支持的密鑰交換算法,選擇什么的密鑰交換算法由SSL服務端所擁有的證書決定。SSL服務端在對客戶端發來的加密套件進行選擇時,要通過它擁有的證書類型來決定是否該選擇該加密套件。我們使用兩種方法來劃分證書的類型,第一種是依據證書的用途,證書從其用途可以分為加密證書和簽名證書等,它們分別指定證書在使用中的不同用途,加密證書用來加密數據,保證數據的保密性,簽名證書用來對數據進行簽名,保證數據的不可抵賴性。第二種劃分方法是依據證書綁定的公鑰類型,目前我們的證書中可以綁定下列公鑰加密算法的公鑰:R
14、SA、DH、ECC和DSS。在SSL中這兩種證書類型的劃分方法都要考慮到,因為它們從不同的方面影響著SSL對密鑰交換算法的選擇,進而決定了SSL的握手過程。下面我們介紹一下在SSL握手過程中進行算法協商時證書所起的作用。當SSL客戶端發起SSL連接請求時,它向SSL服務端發送客戶問候消息,客戶問候消息中包含有客戶端支持的所有加密套件,加密套件中包含有該套件支持的密鑰交換算法。SSL服務端在接收到客戶端發來的客戶問候消息后,它要從客戶端支持的加密套件組中選擇一個加密套件,其中一個重要依據就是服務端擁有的證書。如果待選擇的加密套件中有SSL RSA WITH IDEA CBC SHA,它要求服務端
15、必須提供RSA證書用于鑒別身份和交換密鑰,此時如果SSL服務端有RSA證書,它就可以選擇該加密套件,由于RSA證書中已經包含了密鑰交換算法的參數,服務端就不需要在向客戶端發送密鑰交換消息。客戶端在與服務端進行密鑰交換時,就是利用該證書中綁定的公鑰來加密預加密密鑰。如果服務端沒有RSA證書,而只有支持DSS算法的簽名證書,它就有可能選擇另一個待選擇的加密套件SSL DH DSS WITH 3DES EDE CBC SHA,該加密套件要求密鑰交換采用DH算法,同時必須對服務端進行身份鑒別,因為服務端證書消息中的DSS證書只能供客戶端進行身份認證,所以DH算法的參數需要通過服務端密鑰交換消息傳給客戶
16、端。2) 證書與身份認證證書的另一個重要作用就是身份認證。基于證書的身份認證過程如下:SSL服務端向SSL客戶端發送證書消息,隨后,SSL服務端再向客戶端發送證書請求消息,該消息由兩部分組成,第一部分是請求的證書類型,第二部分是請求證書的發證者CA的名字,也就是服務端信任的CA的名字。SSL客戶端在接收到SSL服務端發來的證書消息后,首先認證服務端證書,如果認證通過,則繼續接收后面的消息,否則將向服務端發送警告消息,并終止連接。當SSL客戶端接收到服務端發來的證書請求消息后,需要向服務端發送客戶證書消息,客戶證書消息中包含有客戶端證書,該證書必須滿足服務端在證書請求中列出的條件,即該證書必須是
17、服務端信任的CA簽發的。在上面我們提到在SSL服務端證書和客戶端證書都分別包含在證書消息中,實際上在證書消息中不只是一個證書,而是個證書鏈。證書鏈由最終實體證書到根以證書的一系列順序排列的證書組成,對證書的認證上就是對該證書鏈進行認證。在SSL協議中并沒有規定具體的認證證書的方法,因此在我們對SSL協議進行實現的過程中必須從可行的認證方法中選擇一種有效和安全的認證方法。我們對證書鏈的認證主要是認證證書鏈中每個證書是否是被其上一級以所簽發的,這個過程可以沿著證書鏈從實體證書一直到證書鏈的末端(即根證書)來順序進行。2、 傳輸加密模塊設計方法采用SSL協議的公開實現OpemSSL提供安全的傳輸機制
18、,應用程序數據的傳輸過程為:1) 程序把應用數據提交給本地的SSL。2) 發送端的SSL先用對應連接的散列算法對應用數據進行散列,得到一個應用數據的散列值。3) 散列值和應用數據一起用加密算法加密。4) 密文通過網絡傳給對方。5) 接收方的SSL用相同的算法對密文解密,得到明文。6) 接收方的SSL用相同的散列算法對明文中的應用數據散列。7) 計算得到的散列值與明文中的散列值比較,如果一致,明文中的應用數據有效,SSL把應用數據上交給接收方的應用層;否則就丟棄數據,并向對方發出報警信息。嚴重的錯誤有可能引起再次的協商或連接中斷。SSL通信模型為標準的CS結構,除了在TCP層之上進行傳輸之外,與
19、一般的通信沒有明顯區別,其服務器端的基本程序結構如下:1) 在使用OpemSSL前,必須先對OpenSSL進行初始化。2) 一次SSL連接會話一般要先申請一個SSL環境,創建本次會話所使用的協議:需要注意的是客戶端和服務器需要使用相同的協議,然后申請SSL會話的環境,使用不同的協議進行會話,其環境也不同。根據自己的需要設置SSL握手階段證書的驗證方式和加載自己的證書。3) SSL使用TCP協議,需要把SSL綁定到已經連接的套接字上。4) 接下來是SSL握手。5) 握手成功之后,就可以進行通信了,使用SSLread和SSLwrite讀寫SSL套接字代替傳統的read和write,使用SSLacc
20、ept代替傳統的accept調用。6) 通信結束,需要釋放前面申請的SSL資源。第五章、程序設計提示與測試1、初始化SSL證書1)初始化Openssl算法庫及協議算法SSL_load_error_strings();SSLeay_add_ssl_algorithms();SSL_METHOD *meth;meth = SSLv23_server_method();/使用SSL V2或V3協議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);/等待該線程執行完畢,開啟下一個線程,繼續等待接收連接。WaitForSingleObject(hd, INFINITE); 3、接收消息線程處理函數1)調用select異步等待消息for(;)FD_ZERO(&writeFds);FD_ZERO(&readFds);FD_ZERO(&excFds);FD_SET(clientFd
24、, &readFds);/異步的方式等待客戶端數據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;提取客戶端數據if(FD_ISSET(clientFd, &readFds)/有客戶端數據需要讀取/接收客戶端數據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);/發送WM_CLIENT_MSG消息到主窗體,把接收到的消息顯示到列表框SendMessage(AfxGetMainWnd()-GetSafeHwnd(),WM_CLIENT_MSG,clientFd,(long )msg1);4、發送消息函數1)服務器發送
26、消息void CServerDlg:OnSend() UpdateData();/遍續所有已經鏈接客戶端,發送消息for(int i=0;iSetActiveWindow();2)服務端發送消息void CClientDlg:OnSend() UpdateData();if(client.fd !=0)/發送消息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);/設置通信協議為TCP/IP協議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); /開始監聽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結構聯系起來*/TCP連接已經準備好,開始啟用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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 仙桃一中研學活動方案
- 代發業務活動方案
- 代理銷售活動方案
- 以誠待人活動方案
- 仲夏冰淇淋活動方案
- 仿生魚機構活動方案
- QBT-食鹽用水質量控制技術規范稿編制說明
- 企業三八節室內活動方案
- 企業人才活動方案
- 企業全年職工活動方案
- 2025照明系統工程合同樣本
- 2025年浙江高中學業水平考試生物試題真題匯編(含答案)
- 2025年計算機Photoshop面試試題及答案
- 真核生物基因表達的調控課件
- 2025年入團考試試題及答案完美呈現
- 2025-2030中國藥品倉儲行業市場發展趨勢與前景展望戰略研究報告
- 2025年全國低壓電工作業證(復審)考試練習題庫(600題)附答案
- 混凝土預制構件項目可行性研究報告參考范文
- 《凈水處理技術》課件
- 南通護理筆試題目及答案
- 柱上變壓器臺與設備安裝標準
評論
0/150
提交評論