Network 【HTTPS请求/AFN】
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
Network 【HTTPS请求/AFN】相关推荐
- Charles抓取https请求
最近公司将Windows产品的http请求,替换成https请求了,当https请求超过5次失败,就自动切换回http请求.测试时使用Charles抓包测试. 一.http抓包 http抓包比较简单, ...
- iOS使用自签名证书实现HTTPS请求
原文链接:http://www.jianshu.com/p/e6a26ecd84aa 由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS ...
- iOS 用自签名证书实现 HTTPS 请求的原理实例讲解
在16年的WWDC中,Apple已表示将从2017年1月1日起,所有新提交的App必须强制性应用HTTPS协议来进行网络请求.默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info ...
- java实现https请求
参考: https://www.cnblogs.com/chinway/p/5802541.html java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易 ...
- 【Fiddler学习】Fiddler抓包HTTPS请求和手机抓包
一.安装Fiddler 百度搜索:Fiddler抓包工具,然后安装即可. 然后打开Fiddler工具,打开浏览器随意输入任何网址,就可以在Fiddler看到抓包信息. 但是:默认情况下,Fiddler ...
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现.在很多地方都需要验证用户身份才可 ...
- iOS 10.3下使用Fiddler抓取HTTPS请求
最近使用Fiddler抓取手机上的HTTPS请求时,遇到一个问题.设置完之后,访问HTTPS的页面,却得到一个错误 网络出错,轻触屏幕重新加载:-1202 (如下图所示) 我印象中,之前都好好的,怎么 ...
- httpsrequest java_java 发送http和https请求的实例
HTTP请求: 如果需要Json格式的自己转下,度娘上N种姿势- //处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或&quo ...
- Fiddler抓包1-抓firefox上https请求
前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddler抓包时候,打开百度网 ...
最新文章
- html基础:定义 图片 表格
- easyui filebox 文件上传
- asp.net 调用苹果摄像头扫描条码_苹果刚刚发布了近两年最值得买的 iPhone
- 易企秀如何生成图片_易企秀可以导出图片吗
- mysql直连1.执行语句_MySQL随笔01_一条SQL语句是如何执行的
- oracle 11g 忘记了sys,system,scott密码
- 实现Modbus ASCII多主站应用
- NSArray中存的是实体时的排序
- kubernetes资源管理
- https 非对称加密
- poj 3261 Milk Patterns
- 实验九 TCP 协议分析实验
- 《遥感原理与应用》总结—遥感平台
- 输入一个字符串,输出该字符串中字符的所有组合。(腾讯2014笔试附加题)
- 【海】沙滩啤酒win7桌面主题
- Altium Designer 20 安装方法及步骤
- 郑晓龙新剧携手吴秀波、孙俪 被曝8月将开拍
- HSV与HSI颜色空间的区别以及和RGB之间的转换
- bigsur cdr文件_macOS Big Sur 11.2 原版引导镜像下载
- 安卓学习笔记--- Android自定义View(CustomCalendar-定制日历控件)
热门文章
- 数据库 --关联查询(多表查询)
- c语言中整除和模除的优先级,整除运算与取模运算
- gsoc 任务_gsoc 2020最终报告wikimedia transferpy改进
- VMware 12 Pro虚拟机安装Ubuntu 16操作系统,选择创建新的虚拟机操作后无反应
- RN 调用原生WebPage 解决微信支付Referer问题
- 32g的u盘速度测试软件,写入超100MB/s?32G神速U盘PK固态硬盘
- iOS好用的三方推荐
- 基于django的 md5加密
- 如何用Yii2编程:ActiveRecord
- PyTorch开发者福音, OpenVINO整合PyTorch实现推理加速!