信息安全認證課件 第九章openSSL編程_第1頁
信息安全認證課件 第九章openSSL編程_第2頁
信息安全認證課件 第九章openSSL編程_第3頁
信息安全認證課件 第九章openSSL編程_第4頁
信息安全認證課件 第九章openSSL編程_第5頁
已閱讀5頁,還剩44頁未讀 繼續免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SSL編程第九章Openssl編程WinsocketSocket,Socket(套接字)是一種網絡編程接口;Socket分為BSDUNIX和windows兩個版本。使用winsock2API編程,必須包含頭文件winsock2.h(鏈接環境WS2_32.LIB),頭文件winsock.h(WSOCK32.LIB)mswsock.h是微軟的擴展類,用于開發高性能的winsock程序.Windows中的Socket編程Windows中的Socket編程Winsock的啟動WinsockAPI基本函數TCP/IP網絡程序框架(C/S模式)WinsockWinsock是一個基于Socket模型的API,在Windows系統中廣泛使用它在Berkeley接口函數的基礎上,還增加了基于消息驅動機制的Windows擴展函數Winsock1.1只支持TCP/IP網絡,Winsock2.2增加了對更多協議的支持Winsock(2)需要包含頭文件Winsock2.h,需要使用庫ws2_32.lib,包含辦法可以用語句來告訴編譯時調用該庫

#pragmacomment(lib,”ws2_32.lib”);如果使用VisualC++6.0,可以通過“工程”>“設置”>“工程設置”>“鏈接”>“對象/庫模塊”中加入“ws2_32.lib”WindowsSocket的啟動使用WinsockAPI編制的網絡應用程序中,在調用任何一個Winsock函數之前都必須檢查協議棧安裝情況,使用函數WSAStartup()完成操作。

intWSAStartup(

WORD

wVersionRequested,

LPWSADATA

lpWSAData );wVersionRequested可以用宏MAKEWORD(2,2)來獲得lpWSAData是一個指向WSADATA結構的指針,它返回關于Winsock實現的詳細信息Winsock啟動示例#include<Winsock2.h>WORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0){ //Winsock初始化錯誤 return;}//說明WinsockDLL正確加載,可以執行以下代碼創建套接口socket()Socket通信分為面向連接的通信(TCP)和面向無連接的通信(UDP).應用程序在使用套接口通信前,必須要擁有一個套接口,使用socket()函數來給應用程序創建一個套接口。

SOCKETsocket(

int

af,

int

type,

int

protocol );

Socket的位置socket()參數說明af參數說明套接字接口要使用的協議地址族,地址族與協議族含義相同。如果想建立一個TCP或UDP,只能用常量AF_INET表示使用互聯網協議(IP)地址。Winsock還支持其他協議,但一般很少使用。type參數描述套接口的類型,af是AF_INET的時候只能為SOCK_STREAM、SOCK_DGRAM或SOCK_RAWprotocol說明該套接口使用的特定協議,當協議地址族af和協議類型type確定后,協議字段可以使用的值是限定的

協議地址族套接口類型套接口類型使用的值協議字段互聯網協議(IP)AF_INETTCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP面向連接的C/S程序工作流程圖(TCP)2.建立套接字套接字是傳輸提供者的一個句柄。SOCKETsocket(

intaf,

//指定通信協議的協議族

inttype,

//要創建的套接字的類型

intprotocol

,//指定應用程序所指定應用程序所使用的通信協議);type:SOCK_STREAM(TCP流套接字),SOCK_DGRAM(UDP數據包套接字),SOCK_RAW(原始套接字)Protocol:。

IPPROTO_TCP,

IPPROTO_UDP,

0如果不想指定)3配置套接字

當創建一個套接字后,套接字數據結構中有一個默認的IP地址和默認的端口號。一個sockaddr結構定義如下:structsockaddr{

u_short

sa_family;

char

sa_data[14];};3配置套接字

structsockaddr_in{

short

sin_family;//通信協議族

u_shortsin_port;//端口號

struct

in_addrsin_addr;//IP地址

char

sin_zero[8];//一般不用,用0填充};sin_family一般為AF_INET,表示使用IP地址族;sin_addr結構體中只有一個唯一的字段s_addr,表示IP地址,IP地址參數為INADDR_ANY,則由系統來自動指定bind函數

intbind(

SOCKETs,

conststructsockaddrFAR*name,

intnamelen

);s標識一個未綁定的套接口;name地址結構指針,存儲了套接口的地址信息namelen表示地址參數(name)的長度

4服務器端實現功能

(1)

服務器端:需要對綁定的端口進行偵聽,需要用到listen()函數(2)從連接請求隊列中取出最前面的一個客戶請求,需要用到accept()函數listen()函數intlisten(

SOCKETs,

//socket句柄

Intbacklog

//客戶連接請求隊列的最大數量);服務程序可以調用listen函數使其流套接字s處于監聽狀態。處于監聽狀態的流套接字s將維護一個客戶連接請求隊列,該隊列最多容納backlog個客戶連接請求。假如該函數執行成功,則返回0;如果執行失敗,則返回SOCKET_ERROR。accept函數SOCKETaccept(

SOCKETs,//偵聽套接字

structsockaddrFAR*addr,

//一個地址結構的指針,用來存放發出連接請求的那個客戶機的IP地址信息

intFAR*addrlen

//返回地址結構的長度

);表示可以接收來自客戶端由connect()發出的連接請求,雙方進入連接狀態。

5客戶端實現connect函數是客戶機建立與遠程服務器連接而使用的.connect函數

intconnect(

SOCKETs,

//

客戶Socket

conststructsockaddrFAR*name,

intnamelen

);

connect函數來使客戶Sockets與監聽于name所指定的計算機的特定端口上的服務Socket進行連接。如果連接成功,返回0,否則返回

SOCKET_ERROR

OpenSSL安全套接字編程OpenSSL安全套接字編程與普通套接字編程類似;OpenSSL提供了和普通socket類似的函數如SSL_connect,ssl_accept,ssl_write,ssl_read另外OpenSSL還需要設置其他的環境參數,如服務器證書。OpenSSL涉及SSL的函數1.初始化SSL算法庫函數intssl_library_init(void);功能:初始化SSL算法庫,調用SSL函數之前必須調用此函數;OpenSSL涉及SSL的函數2.初始化SSL上下文環境變量的函數SSL_CTX*ssl_ctx_new(SSL_METHOD*meth)方法如sslv23_server_method,sslv23_client_method返回值:成功為SSL_CTX結構體指針,否則返回NULL.3.釋放SSL上下文環境變量的函數VoidSSL_CTX_free(SSL_CTX*CTX)OpenSSL涉及SSL的函數4.設置SSL證書函數intSSL_CTX_use_certificate_file(SSL_CTX*ctx,constchar*file,inttype)功能:以文件形式設置SSL證書;ctx:ssl上下文環境file:證書文件路徑type:證書編碼類型,type支持SSL_FILETYPE_PEM,SSL_FILETYPE_ASN1這兩種類型證書OpenSSL涉及SSL的函數5.設置SSL私鑰函數intSSL_CTX_use_private_file(SSL_CTX*ctx,constchar*file,inttype)file:私鑰文件路徑。返回值:成功返回1,否則返回0;OpenSSL涉及SSL的函數6.檢查SSL私鑰函數intSSL_CTX_check_private_key(constSSL_CTX*ctx)ctx:ssl上下文環境

成功返回1,否則返回0;OpenSSL涉及SSL的函數7.新建SSL句柄SSL*SSL_new(SSL_CTX*ctx)功能:為一個SSL連接建立SSL*的結構體變量;8.釋放SSL句柄VoidSSL_free(SSL*ssl);OpenSSL涉及SSL的函數9.設置socket句柄函數

intSSL_set_fd(SSL*ssl,intfd)Ssl:SSL*類型數據Fd:socket連接句柄功能:為SSL結構體設置socket連接句柄;成功返回1,否則返回0OpenSSL涉及SSL的函數10.SSL_connect()函數IntSSL_connect(SSL*ssl)功能:用于客戶端,建立SSL連接;11.SSL_accept()函數IntSSL_accept(SSL*ssl)功能:用于服務器端,接受一個SSL連接。OpenSSL涉及SSL的函數12.獲得SSL連接使用的證書的函數X509*SSL_get_peer_certificat(constSSL*s)功能:獲得SSL連接使用的證書,對客戶端,得到的是服務器證書,對服務器端,得到的是客戶端證書;成功返回X509證書,否則返回NULL.OpenSSL涉及SSL的函數13.發送SSL數據函數IntSSL_write(SSL*ssl,constvoid*buf,intnum)功能:發送SSL數據;成功返回實際發送的數據長度,否則返回-1;

ssl:SSL連接句柄;buf:指向待發送數據的指針;num:待發送數據的長度;

14.讀取SSL數據函數IntSSL_read(SSL*ssl,constvoid*buf,intnum)功能:讀取SSL數據;成功返回實際讀取的數據長度,否則返回-1;

ssl:SSL連接句柄;Buf:指針,指向保存讀取數據的區域地址;Num:讀取到的數據的長度;實習要求編寫一個客戶端/服務器(client/server)的程序;服務器端的功能是建立SSL網絡服務,接受客戶端的SSL連接,收發SSL消息;客戶端的功能是通過SSL協議連接服務器,收發SSL消息。服務器端程序實現1.初始化服務器端SSL協議算法,新建SSL上下文環境;2.讀取服務器證書和私鑰,并檢查私鑰和證書的公鑰是否匹配;3.綁定網絡監聽端口,開始監聽;4.接受SSL連接;5.收發SSL數據;6.關閉SSL連接;1.定義一些必要的變量interr; intlisten_sd;//監聽句柄

intsd; structsockaddr_insa_serv;//sockaddr_in結構體,用于保存服務器端協議和端口信息

structsockaddr_insa_cli; size_tclient_len; SSL_CTX*ctx; //SSL上下文句柄

SSL*ssl; //SSL結構體指針

X509*client_cert;//X509結構體,用戶保存客戶端證書

char*str; charbuf[4096]; SSL_METHOD*meth; //SSL協議

WSADATA wsaData;2初始化服務器端SSL協議算法if(WSAStartup(MAKEWORD(1,1),&wsaData))//初始化windowsSocket環境。 { exit(1); }

SSL_load_error_strings(); SSLeay_add_ssl_algorithms();//初始化OpenSSL環境

meth=SSLv23_server_method();//SSL協議版本,V2、V3自適應

//新建SSL上下文句柄

ctx=SSL_CTX_new(meth); if(!ctx){ ERR_print_errors_fp(stderr); exit(2); }3讀取服務器證書和私鑰

//設置服務器證書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)){ fprintf(stderr,"Privatekeydoesnotmatchthecertificatepublickey\n"); exit(5); }5綁定網絡監聽端口

//新建Socket listen_sd=socket(AF_INET,SOCK_STREAM,0);

//初始化sa_serv,設置為TCP協議,端口為8443 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(8443);

5開始監聽//綁定端口

err=bind(listen_sd,(structsockaddr*)&sa_serv,sizeof(sa_serv));//開始接收TCP鏈接。

err=listen(listen_sd,5);6.接受SSL連接sd=accept(listen_sd,(structsockaddr*)&sa_cli,(int*)&client_len);//新建SSL ssl=SSL_new(ctx);//設置鏈接句柄到SSL結構體

SSL_set_fd(ssl,sd); //接受SSL鏈接

err=SSL_accept(ssl);7.收發ssl數據//讀取客戶端發送的消息

err=SSL_read(ssl,buf,sizeof(buf)-1); buf[err]='\0'; printf(“從客戶端得到%d個字符:'%s'\n",err,buf); //發送消息到客戶端

err=SSL_write(ssl,"Ihearyou.",strlen("Ihearyou."));客戶端程序實現1.定義一些必要的變量;2.初始化客戶端的SSL協議算法;3.建立SSL連接4.獲得服務端證書5.收發SSL數據;6.關閉SSL連接;1.定義一些必要的變量;interr; intsd; //socket句柄

structsockaddr_insa; //sockaddr_in結構體

SSL_CTX*ctx; //SSL上下文句柄

SSL*ssl; //SSL結構體指針

X509*server_cert; //X509結構體,用戶保存服務器端證書

char*str; charbuf[4096]; SSL_METHOD*meth; //SSL協議

WSADATA wsaData;2.初始化客戶端的SSL協議算法//初始化windowsSocket環境

if(WSAStartup(MAKEWORD(1,1),&wsaData)) { return; }//初始化OpenSSL環境

SSL_load_error_strings(); SSLeay_add_ssl_algorithms();//SSL協議版本,V2、V3自適應

meth=SSLv23_client_method(); ctx=SSL_CTX_new(meth);3.建立SSL連接//以常規的SOCKET編程的方式創建socket并鏈接到服務器端

sd=socket(AF_INET,SOCK_STREAM,0);

memset(&sa,'\0',sizeof(sa)); sa.sin_family=AF_INET; sa.sin_addr.s_addr=inet_addr("127.0.0.1");//服務端地址

sa.sin_port=htons(8443);//服務端口//鏈接服務器

err=connect(sd,(structsockaddr*)&sa,sizeof(sa));3.建立SSL連接//使用現有的TCP鏈接開啟SSL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論