关于SSL的一些介绍,在上篇文章中《关于SSL的初步理解》有介绍过。下面主要介绍SSL在IOS下的应用.
首先,由于SSL提供了一套数据加密通信的安全协议,其实现过程偏底层,且过程极其复杂。好在Github上为我们提供了一套开源的Socket框架CocoaAsyncSocket,基于TCP、UDP的功能封装也是相当的完整。
一.目录结构
实现方式也是基于GCD完成,CocoaAsyncSocket中主要包含两个类:
1.GCDAsyncSocket
用GCD搭建的基于TCP/IP协议的socket网络库
GCDAsyncSocket is a TCP/IP socket networking library built atop Grand Central Dispatch. -- 引自CocoaAsyncSocket.
2.GCDAsyncUdpSocket
用GCD搭建的基于UDP/IP协议的socket网络库.
GCDAsyncUdpSocket is a UDP/IP socket networking library built atop Grand Central Dispatch..-- 引自CocoaAsyncSocket.
二.客户端的创建
1.继承GCDAsyncSocketDelegate协议
2.声明属性
@property (nonatomic,strong)GCDAsyncSocket *clientSocket;//客户端socket
3.创建socket并制定代理对象为self
dispatch_queue_t delegateQueue = dispatch_queue_create("dispatch_queue_concrate", DISPATCH_QUEUE_CONCURRENT);
//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:delegateQueue];
4.连接指定主机对应端口,连接的主机为IP地址,并非DNS名称.
NSError *error;
BOOL isConnect = [self.clientSocket connectToHost:@"127.0.0.1" onPort:5036 error:&error];
if (!isConnect) {
NSLog(@"连接失败,:%@",error);
}else{
NSLog(@"连接成功");
}
5.实现GCDAsyncSocketDelegate代理方法
1.连接成功代理回调
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
NSLog(@"socket连接成功:%@,port:%hu",host,port);
[self addSecurtyTransport];
//开始读取来自server端的数据
[sock readDataWithTimeout:-1 tag:0];
}
2.开始手动签名验证回调,需要实现startTLS方法才会被执行。
-(void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL))completionHandler
{
NSLog(@"thread:%@",[NSThread currentThread]);
/*
* This is only called if st