Network 【HTTPS请求/AFN】
来源:互联网 发布:淘宝客服月薪一般多少 编辑:程序博客网 时间:2024/06/16 03:37
HTTPS请求过程
如下图:
① 客户端输入网址https://www.domain..com,连接到server的443端口。
② 服务器返回一个证书(包含公钥、和证书信息,如证书的颁发机构,过期时间等),证书由服务器所拥有的私钥非对称加密生成。
③ 客户端对证书进行验证(首先会验证证书是否有效,比如颁发机构,过期时间等等)。
④ 如果客户端验证通过,客户端生成一个随机数,在用服务器返回的证书(公钥)进行加密传输。
⑤ 因为公钥是通过服务器的私钥生成,所以服务器是可以对客户端的传回的加密数据进行对称解密的。服务器拿到由客户端生成的随机数,对要传递的数据使用随机数加密。
⑥ 客户端收到服务器使用随机数加密的数据进行解密。
苹果已经封装了HTTPS连接的建立、数据的加密解密功能,我们直接可以访问https网站的,但苹果并没有验证证书是否合法,无法避免中间人攻击。要做到真正安全通讯,需要我们手动去验证服务端返回的证书。AFNetwork中的AFSecurityPolicy模块主要是用来验证HTTPS请求时证书是否正确。 AFSecurityPolicy封装了证书验证的过程,让用户可以轻易使用,除了去系统信任CA机构列表验证,还支持SSL Pinning方式的验证。
请求 信任的HTTPS 和 不信任的HTTPS 代码如下:
//// ViewController.m// 0720-01HTTPS请求(AFN)-01//// Created by 王中尧 on 16/7/20.// Copyright © 2016年 wzy. All rights reserved.///* 使用AFN HTTPS 请求 如果发送的请求是HTTPS的请求,那么有两种情况 ----- 001 请求的网站所使用的证书是CA签名&加密的方式满足ATS的要求 那么我们在代码中什么都不需要做(比如说github官网,就是信任的https) 不管是信任,还是不信任,都要写:(设置反序列化方法) // 设置反序列化方法 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; ----- 002 请求的网站所使用的证书是自签名,需要做如下操作:(比如说12306,就是不信任的https) 1) 禁用ATS特性 // 设置允许不受信任的证书(该参数默认为no) securityPolicy.allowInvalidCertificates = YES; // 设置不验证域名(该参数默认为yes) securityPolicy.validatesDomainName = NO; 2) 需要在代码中信任证书(安装) 在Info.plist 里面设置上两行属性(添加HTTP) 2017年1月1日 就不允许使用HTTP请求了 */#import "ViewController.h"#import "AFNetworking.h"@interface ViewController ()@end@implementation ViewController- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self believe];// [self unBelieve];}// 信任的HTTPS 百度- (void)believe { // 创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 设置反序列化方法 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:@"https://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"success---%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failure---%@", error); }];}// 不信任的HTTPS 12306官网- (void)unBelieve { // 创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 设置反序列化方法 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; /** typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { AFSSLPinningModeNone, // 这个模式表示不做SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的 AFSSLPinningModePublicKey, // 这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息 AFSSLPinningModeCertificate, // 这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致 }; */ // AFNetwork中的AFSecurityPolicy模块主要是用来验证HTTPS请求时证书是否正确 // 验证证书的模式 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; /** Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. */ // 设置允许不受信任的证书 securityPolicy.allowInvalidCertificates = YES; /** Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES` for `AFSSLPinningModePublicKey` or `AFSSLPinningModeCertificate`, otherwise `NO`. */ // 设置不验证域名 securityPolicy.validatesDomainName = NO; manager.securityPolicy = securityPolicy; [manager GET:@"https://kyfw.12306.cn/otn" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"success---%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failure---%@", error); }];}@end
2 0
- Network 【HTTPS请求/AFN】
- AFN框架https请求
- iOS开发 AFN配置https请求
- iOS开发 AFN配置https请求
- iOS - 简述二次封装AFN,设置请求头,https安全策略
- afn https网络访问
- AFN之HTTPS
- AFN&SDWebImage配置HTTPS
- HTTPS AFN 验证
- AFN使用HTTPS
- iOS 开发 https问题使用AFN进行网络请求时做的一些配置
- AFN同步异步请求
- AFN之数据请求
- AFN请求常用部分
- 封装AFN请求
- AFN 设置请求数据类型
- AFN同步异步请求
- AFN同步异步请求
- html5文件-上传
- windows下qt5使用ffmpeg(不用编译源码)
- 【NGUI】记录button的动态效果
- 关于苹果推送和证书
- Ubuntu SDK 安装
- Network 【HTTPS请求/AFN】
- Ubuntu SDK 安装
- Vector用法详解
- Dll注入经典方法完整版
- MSReportBuilder 开发学习二
- iterm 2 快捷键
- JTAG仿真器接反了会出现什么现象
- 10 种机器学习算法的要点(附 Python )
- WordPress工作原理之程序文件执行顺序