iOS 网络(二)-HTTP、HTTPS

一、URL

URL的全称是Uniform Resource Locator(统一资源定位符)。
通过1个URL,能找到互联网上唯一的1个资源。
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL。

URL中常见的协议

(1)HTTP
超文本传输协议,访问的是远程的网络资源,格式是http://
http协议是在网络开发中最常用的协议。
(2)file
访问的是本地计算机上的资源,格式是file://(不用加主机地址)
(3)mailto
访问的是电子邮件地址,格式是mailto:
(4)FTP
访问的是共享主机的文件资源,格式是ftp://

URN、URI

URN:Uniform Resource Name,统一资源名称,指互联网上某一独一无二的资源的名称。
URI:Uniform Resource Identifier,统一资源标志符,是标志互联网上某一资源的字符串,它包含URL和URN。所以,URN如同一个人的名称,URL代表一个人的地址。

二、HTTP

HTTP的全称是Hypertext Transfer Protocol,超文本传输协议。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
HTTP属于应用层面向对象协议。

1.通信过程

(1)请求:客户端向服务器索要数据。
(2)响应:服务器返回客户端相应的数据。

2.请求

HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容:

  • 请求行:包含了请求方法、请求资源路径、HTTP协议版本,例如:GET /MJServer/resources/images/1.jpg HTTP/1.1
  • 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息。
    Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
    Accept: text/html, /// 客户端所能接收的数据类型
    Accept-Language: zh-cn // 客户端的语言环境
    Accept-Encoding: gzip // 客户端支持的数据压缩格式
  • 请求体:客户端发给服务器的具体数据,比如文件数据。
3.响应

客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端。
HTTP协议规定:1个完整的HTTP响应中包含以下内容:

  • 状态行:包含了HTTP协议版本、状态码、状态英文名称。例如:HTTP/1.1 200 OK
  • 响应头:包含了对服务器的描述、对返回数据的描述。
    Server: Apache-Coyote/1.1 // 服务器的类型
    Content-Type: image/jpeg // 返回数据的类型
    Content-Length: 56811 // 返回数据的长度
    Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
  • 实体内容:服务器返回给客户端的具体数据,比如文件数据。
4.常见状态码
5.发送请求的方法

在HTTP/1.1协议中,定义了8种发送http请求的方法:GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH。最常用的是GET和POST。GET和POST的主要区别表现在数据传递上。

GET

在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如:http://ww.test.com/login?username=123&pwd=234&type=JSON
由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB。

POST

发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)。

对比

(1)如果要传递大量数据,比如文件上传,只能用POST请求
(2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
(3)如果仅仅是索取数据(数据查询),建议使用GET
(4)如果是增加、修改、删除数据,建议使用POST

三、OC原生网络类

1.NSURLConnection

iOS9已弃用

2.NSURLSession

使用简单,先根据对象创建一个Task,然后执行Task即可。

(1)NSURLSessionConfiguration

用于配置NSURLSession工作模式以及网络设置。

//工作模式
//普通模式:可以使用缓存
@property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration;
//瞬时模式:不使用缓存
@property (class, readonly, strong) NSURLSessionConfiguration *ephemeralSessionConfiguration;
//后台模式:在后台时仍能进行下载操作,需要唯一的identifier标识
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));

//允许使用蜂窝数据
@property BOOL allowsCellularAccess;
(2)NSURLSession获取
//共享会话,使用全局的cookie,缓存数据
@property (class, readonly, strong) NSURLSession *sharedSession;
//使用配置好的configuration
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
//与第二种类似,制定了delegate
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;
(3)NSURLSessionTask

会话任务,通过NSURLSession创建,有下面3种常用子类:

NSURLSessionDataTask

最普通的网络访问,多用来获取xml或者json。创建后的NSURLSessionTask需要调用resume才会执行。

NSURLSessionDownLoadTask

用来处理下载任务。

NSURLSessionUploadTask

用来处理上传任务,NSURLSessionDataTask的子类。

(4)发送请求
    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [@"" dataUsingEncoding:NSUTF8StringEncoding];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"%@",dic);
        }
    }];
    [dataTask resume];
(5)代理方法
#import "DJViewController.h"
@interface DJViewController ()<NSURLSessionDataDelegate>

@end

@implementation DJViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [@"" dataUsingEncoding:NSUTF8StringEncoding];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
    [dataTask resume];
    
    
}


//接收服务器响应的时候调用该方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    /*
     需要使用completionHandler回调告诉系统如何处理服务器返回的数据,默认是取消
    NSURLSessionResponseCancel = 0,//取消
    NSURLSessionResponseAllow = 1,//接收服务器返回的数据
    NSURLSessionResponseBecomeDownload = 2,//变成下一个请求
    NSURLSessionResponseBecomeStream//变成一个流
    */
    completionHandler(NSURLSessionResponseAllow);
}
//接收到服务器返回数据会调用该方法,如果数据较大,那么该方法会调用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    
}
//当请求完成的时候会调用该方法
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    
}

@end
3.CFNetwork

CFNetwork是ISO中一个比较底层的网络框架,C语言编写,可以控制一些更底层的东西,如各种常用网络协议、Socket通讯等。

(1)CFNetwork结构
  • CFSocket
    Socket是网络通讯的底层基础,两个Socket端口可以互发数据。我们通常使用的是BSD Socket,CFSocket则是BSD Socket的抽象,基本上实现了几乎所有BSD Socket的功能,并且还融入了RunLoop。
  • CFStream
    CFStreamAPI提供了数据读写的方法,即读写流,使用它可以为内存、文件、网络(使用Socket)的数据建立stream,我们进行网络请求就是对数据的读写,CFStream提供API对两种CFType对象提供抽象:CFReadStreamCFWriteStream。它同时也是CFHTTP和CFFTP的基础。stream有一个很重要的特性就是一旦数据流被提供或者被消耗,就不能从流中重新取出。
  • CFFTP
    对用FTP协议通信的封装,能下载、上传文件和目录到FTP服务器。CFFTP建立的连接可以是同步或者异步。
  • CFHTTP
    是HTTP协议的抽象,主要对象是CFHTTPMessageRef(类似于我们通常的NSURLRequest)我们需要像构建NSURLRequest那样来构建CFHTTPMessageRef
    必要元素:
    请求方法 (类型为CFStringRef):POST、GET、DELETE等。
    请求的URL地址 (类型为CFURLRef):https://www.baidu.com
    请求的HTTP版本(类型为CFStringRef):通常使用kCFHTTPVersion1_1。
    kCFAllocatorDefault:用于创建消息引用的指定默认的系统内存分配器。
    可选参数:
    body体(类型为CFDataRef)。
    消息头部,如User-Agent等。
    #######(2)CFNetwork请求过程
#import "DJViewController.h"
#import <CFNetwork/CFNetwork.h>
@interface DJViewController ()<NSURLSessionDataDelegate>
@property(nonatomic,strong)NSMutableData *imageData;
@end

@implementation DJViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    CFStringRef urlStr = CFSTR("http://pics.sc.chainaz.com/files/pic/pic9/201605/apic20649.jpg");
    CFStringRef method = CFSTR("GET");
    CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);
    CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
    CFRelease(url);
    CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
    CFRelease(request);
    //设置流的context,这里将self传入,用于回调
    CFStreamClientContext ctx = {0,(__bridge  void *)(self),NULL,NULL,NULL};
    //设置回调事件,用于监听网络事件
    CFOptionFlags event = kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered;
    CFReadStreamSetClient(readStream, event, myCallBack, &ctx);
    //打开输入流
    CFReadStreamOpen(readStream);
    //将流加入到runloop中
    CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    //开启runloop
    CFRunLoopRun();
    
}
//回调函数
void myCallBack(CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo){
    DJViewController *selfClass = (__bridge  DJViewController *)clientCallBackInfo;
    if (type == kCFStreamEventHasBytesAvailable) {
        UInt8 buff[255];
        CFIndex length = CFReadStreamRead(stream, buff, 255);
        if (!selfClass.imageData) {
            selfClass.imageData = [NSMutableData data];
        }
        [selfClass.imageData appendBytes:buff length:length];
    }
    else if (type == kCFStreamEventEndEncountered) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        //关闭流
        CFReadStreamClose(stream);
        //将流从runloop中移除
        CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    }
}
@end
4.AFNetworking
(1)NSURLSession网络请求模块
  • AFHTTPSessionManager继承自AFURLSessionManager,post、get、上传。
  • AFURLSessionManager管理所有的请求,设置了NSURLSessionTaskDelegate, NSRULSessionDataDelegateNSURLSessionDownloadDelegate实现证书合法性校验,数据传输进度检测,数据请求成功/失败的回调。
    使用Runtime用af_suspend替换suspend, 用af_resume替换了resume 当调用者两个方法时往上层发送通知AFNetworkingTaskDidSuspendNotificationAFNetworkingTaskDidResumeNotification
    请求服务器数据、上传数据、多线程下载数据
(2)Reachability监测网络状态模块

AFNetworkReachabilityManager

(3)Security安全策略模块

AFSecurityPolicy
iOS项目将服务器端的证书保存导入到项目中,AFN根据项目中的服务器证书来进行验证,验证服务器,保证访问服务器的安全性。
验证证书的模式有三种:
AFSSLPinningModeNone不验证
AFSSLPinningModePublicKey只验证公钥
AFSSLPinningModeCertificate验证证书的所有内容

(4)Serialization序列化

AFURLRequestSerialization
AFURLResponseSerialization

(5)UIKit UI相关的一些类目
(6)原理概述

AFNetworking是对NSURLSessionTask的封装。AFHTTPSessionManager继承AFURLSessionManager对网络请求进行管理,使用AFURLRequestSerialization对网络请求进行封装,使用AFURLResponseSerialization对响应体进行处理,使用AFSecurityPolicy对服务器证书进行校验。支持HTTPS协议,支持本地证书和服务器证书进行对比验证。AFN数据传递主要使用block和Notification方式。

(7)请求过程

1)GET/POST方法调用抽象的请求方法,指明请求参数,调用全能数据请求方法,指明数据请求方式和参数。
2)对请求进行序列化,如果序列化失败,就执行failure block。
3)为每一个NSURLSessionDataTask的dataTask增加代理。
4)对每一个NSURLSessionDataTask的dataTask增加代理的具体实现,对dataTask设置请求之后的回调delegate和处理block。

三、HTTPS

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。
HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP之间)。这个系统提供了身份验证与加密通讯方法。

1.SSL

SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
SSL协议可分为两层:
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

(1)SSL单向认证具体过程

客户端执行HTTPS请求时,需要由TCP协议建立和释放连接。这就涉及TCP协议的三次握手和四次挥手。
TCP连接建立好后,对于HTTP而言,服务器就可以发送数据给客户端。但是对于HTTPS,它还要运行SSL/TLS协议,SSL/TLS协议分两层,第一层是记录协议,主要用于传输数据的加密压缩;第二层是握手协议,它建立在第一层协议之上,主要用于数据传输前的双方身份认证、协商加密算法、交换密钥。

单向认证流程:
1)第一步,客户端向服务器端发起Client Hello,请求内容包括:
a. 客户端支持的SSL/TLS协议版本列表;
b. 客户端支持的对称加密算法列表;
c. 客户端生成的随机数A;
2)第二步,服务器端回应客户端Server Hello,回应内容包括:
a. 双方都支持的SSL/TLS协议版本;
b. 双方都支持的对称加密算法;
c. 服务器密钥库中的证书;
d. 服务器端生成的随机数B;
3)第三步,客户端收到服务器端回应,客户端检查服务器端证书是否合法,验证内容如下:
a. 服务器端证书是否过期;
b. 服务器端证书是否被吊销;
c. 服务器端证书是否可信;
d. 服务器端证书域名和客户端请求域名是否一致。
验证通过后,客户端回应服务器端,回应内容包括:
a. 客户端生成一个“随机数C”,“随机数C”也被称为”pre-master-key”,然后使用服务器端证书中的公钥加密“随机数C”,将加密后的“随机数C”发送给服务器端;
4) 第四步,服务器端使用密钥库中的私钥解密加密后的“随机数C”得到“随机数C”,此时客户端和服务器端都拿到了随机数A、随机数B、随机数C,双发通过这3个随机数使用相同的密钥交换算法计算得到相同的对称加密密钥,这个对称加密密钥就作为客户端和服务器端数据传输时对称加密使用的密钥。
服务器端和客户端,握手结束,之后就可以用对称加密传输数据了。

(2)SSL双向验证

SSL单向验证过程中,客户端会验证自己访问的服务器端,服务器端对客户端不做验证。如果服务器端验证客户端,则需要开启服务器端验证,这就是双向验证。
SSL双向验证和单向验证的不同之处在于:
a.第二步中服务器端第一次回应客户端的Server Hello消息中,会要求客户端提供客户端证书;
b.第三步中客户端验证完服务器端证书后,回应的内容中,会增加两个信息:
a) 客户端证书;
b) 客户端证书验证消息(CertificateVerify message):客户端将之前所有收到的和发送的消息组合起来,并用hash算法得到一个hash值,然后用客户端密钥库的私钥对这个hash进行签名,这个签名就是CertificateVerify message;
c.服务器端收到客户端证书后,会做如下处理:
a) 确认客户端发送的证书是有效合法的;
b) 用客户端证书中的公钥验证收到信息中的签名,以确定这个证书是客户端发出的;

(3)SSL双向认证和SSL单向认证的区别

双向认证 SSL 协议要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用128位加密通讯的原因。

2. HTTPS使用NSURLSession请求

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDataDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    /*
    HTTPS请求的时候:
    [1] 证书是受信任的,什么都不用做
    [2] 证书是不受信任的,是自签名的
        (1) 修改配置文件,禁用ATS特性
        (2) 信任并安装(数字证书)
    */

    //    12306(之前不是ca认证这里仍然使用该网站举例)
        NSURL *url = [NSURL URLWithString:@"https://kyfw.12306.cn/otn/"];

        NSURLSession *session = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
        
        NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
               
               NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
               
        }];
           
        [dataTask resume];
    
    
}

#pragma mark - NSURLSessionDataDelegate
/*
challenge:挑战,质询
当我们发送的是一个HTTPS请求的时候就会调用该方法,需要在该方法中处理证书
NSURLAuthenticationMethodServerTrust:服务器信任
HTTP:80
HTTPS:443
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
    
    
    NSLog(@"%@",challenge.protectionSpace);
     /*
       NSURLSessionAuthChallengeUseCredential = 0, 使用证书
       NSURLSessionAuthChallengePerformDefaultHandling = 1,  忽略证书
       NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 请求被取消,证书被忽略
       NSURLSessionAuthChallengeRejectProtectionSpace = 3, 拒绝
        */
    
    //判断只有当时NSURLAuthenticationMethodServerTrust的时候才安装这个证书
       if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
           return;
       }
    
    //根据服务器中的保护控件的服务器信任,来创建一个认证信息
    NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
    
}

@end
3.HTTPS使用AFNetworking发送请求
#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**
     //证书受信任
     
    //01 创建会话管理者对象
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
     //修改对响应的序列化方式
     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
     
     //02 发送请求
     [manager GET:@"https://www.alipay.com/" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         
         NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         NSLog(@"error---%@",error);
     }];
    */
    
    
    //01 创建会话管理者对象
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
     //修改对响应的序列化方式
     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
     
     //设置AFN中的安全配置
    //01 允许接收无效的证书
     manager.securityPolicy.allowInvalidCertificates = YES;
    //02 不做域名验证
     manager.securityPolicy.validatesDomainName = NO;
     //03 修改info.plist文件ATS
     
     //02 发送请求
     [manager GET:@"https://kyfw.12306.cn/otn/" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         
         NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         NSLog(@"error---%@",error);
     }];
     
}

/**
 AFNetworking:中的类AFSecurityPolicy说明:
 
 AFSecurityPolicy,内部有三个重要的属性,如下:

 AFSSLPinningMode SSLPinningMode;    //该属性标明了AFSecurityPolicy是以何种方式来验证
 BOOL allowInvalidCertificates;      //是否允许不信任的证书通过验证,默认为NO
 BOOL validatesDomainName;           //是否验证主机名,默认为YES

 "AFSSLPinningMode"枚举类型有三个值,分别是AFSSLPinningModeNone、AFSSLPinningModePublicKey、AFSSLPinningModeCertificate。

 "AFSSLPinningModeNone"代表了AFSecurityPolicy不做更严格的验证,"只要是系统信任的证书"就可以通过验证,不过,它受到allowInvalidCertificates和validatesDomainName的影响;

 "AFSSLPinningModePublicKey"是通过"比较证书当中公钥(PublicKey)部分"来进行验证,通过SecTrustCopyPublicKey方法获取本地证书和服务器证书,然后进行比较,如果有一个相同,则通过验证,此方式主要适用于自建证书搭建的HTTPS服务器和需要较高安全要求的验证;

 "AFSSLPinningModeCertificate"则是直接将本地的证书设置为信任的根证书,然后来进行判断,并且比较本地证书的内容和服务器证书内容是否相同,来进行二次判断,此方式适用于较高安全要求的验证。

 如果HTTPS服务器满足ATS默认的条件,而且SSL证书是通过权威的CA机构认证过的,那么什么都不用做。如果上面的条件中有任何一个不成立,那么都只能修改ATS配置。

 
 */

@end

四、HTTPS和HTTP的区别

(1)HTTPS协议需要到ca申请证书,一般免费证书很少,需要交费。
(2)HTTP是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的SSL加密传输协议。
(3)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(4)HTTP的连接很简单;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容