




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度河北省护师类之护士资格证全真模拟考试试卷A卷含答案
- 2024年度河北省护师类之护师(初级)真题练习试卷A卷附答案
- 2024年度河北省护师类之护师(初级)基础试题库和答案要点
- 2025江苏扬州拓普人才开发有限公司招聘劳务派遣工作人员4人笔试备考试题及参考答案详解1套
- 2025年统编版语文四年级下册第二次月考测试题附答案(有2套)
- 2025年天津经开区一中高一下第二次月考-语文试卷
- 江苏省南京市2024-2025学年高二下学期3月月考物理试题(解析版)
- 四川省成都市2024-2025学年高二下学期3月月考物理试题(解析版)
- 业精于勤妆 尽力各种方案;精益求精才能
- 教学手机课件
- 2022年上海公务员考试《申论》A卷
- 车辆调度培训课件
- 公司职工书屋借阅制度范本
- 2023年全国高中数学联赛试题参考答案
- 凝血分析的质量控制
- 医院2023年灾害脆弱性分析报告
- 超小型智能液压挖掘机机械结构设计-毕业论文
- 软件开发项目工作量及报价模板
- 接待意识和顾客冲突知识培训讲座
- 野外生存优秀课件
- 高考历史大题答题模板
评论
0/150
提交评论