1.什么是HTTP
2.理解HTTPS,SSL,TLS的工作原理
3.网络请求在iOS10+之后的使用注意事项,适配苹果的强制要求(全面适配HTTPS请求),兼容iOS10+,提高安全性
4.NSURLSession的基本使用
HTTP历程
HTTP诞生:www刚起步
HTTP/0.9版本:只有一个GET命令
HTTP/1.0版本:可以传输文字,图像,视频和二进制文件
HTTP/1.1版本:目前最流行的版本
HTTPS:以安全为目标的HTTP通道
HTTP的工作流程
超文本传输协议(HyperText Transfer Protocol)首先是TCP层面的三次握手,建立起客户端和服务端的连接,连接成功后,客户端和服务端就可以进行正常的HTTP网络请求
1.客户端发送同步报文SYN
2.服务端回复报文SYN,ACK
3.客户端回复ACK报文
然后是客户端和服务端进行HTTP层面的请求和响应
当这个网络请求和响应结束后,需要关闭这条TCP协议的通道
断开流程(TCP层面)
6.如果这个断开是客户端发起的,首先由客户端FIN终止报文
7.服务端回复ACK确认报文
客户端收到后,此时客户端向服务端方向的连接就已经断开了
过一段时间
8.服务端会发送FIN,ACK终止报文
9.客户端会回复ACK确认报文
此时由服务端向客户端方向的TCP连接通道就关闭了
TCP连接通道是一条双向的通道,意思是客户端可以通过这条通道向服务器端发送数据,服务器端同样可以通过这条通道向客户端发送数据,并不是两条通道
image.png
59854是客户端临时端口号,80是服务器端口号
所以这是一条由客户端发向服务端的SYN同步报文
下面看到还有80-59854的SYN,ACK报文以及59854-80的ACK报文
在这三次TCP之后,连接已经接通,点击下面的HTTP请求,看它的原始端口号,就会找到59854-80的请求以及80-59854的返回结果
HTTP的报文格式
image.pngCRLF为回车换行
首部字段一般是说明本次HTTP请求的一些要求
请求报文
请求报文分请求行和首部行,实体主体GET一般不用
POST请求时,请求数据是放在HTTP的body中,body就是实体主体
请求行中的方法为:GET和POST
首部行:多个key-Value字段
下图即为GET请求的请求行
响应报文
响应报文分状态行和首部行,实体主体经常用到
服务端的返回结果,就在实体主体中
JSON是一种数据格式
下面两张图为本次响应报文的Header和JSON
HTTPS-基于SSL层的HTTP
HTTPS是以安全为目标的HTTP通道,即HTTP的安全版,这个安全是基于SSL层实现的
HTTP和HTTPS的区别
1.HTTP不需要证书,HTTPS协议需要到CA(证书认证机构)去申请证书,需要交费,免费的少,为了规避网路漏洞及某些不安全因素
2.HTTP是明文传输,HTTPS则是具有安全性的SSL加密传输
3.端口不一样,HTTP是80,HTTPS是443
4.HTTPS可以进行加密传输,身份认证,比HTTP安全
下图为HTTP和HTTPS的返回数据抓包
HTTP是明文数据,之前在开发中我们就算加密也是对body的简单加密
但HTTPS我们看到的就是乱码,根本看不到具体的内容,就算获取到乱码,因为我们不知道解密算法和公钥私钥,所以也无法解析
HTTPS为何安全
SSL:安全套接字层
TLS:安全传输层,为SSL的继任者
SSL和TL�S在传输层之上对网络连接进行加密,为网络通信提供安全及数据完整性
下面看HTTP和HTTPS的层级结构
可以看到,HTTP是将数据放到HTTP应用层,然后到TCP传输层,再到IP网络层
而HTTPS是将数据放到HTTP应用层,然后经过TLS&LLS中间层加密后,然后到TCP传输层,再到IP网络层
下图是HTTPS的工作流程
首先发送方将数据放到HTTP应用层,然后经过TLS&LLS中间层加密后,然后到TCP传输层,再到IP网络层传过去
接收方在IP网络层收到数据,显示传到TCP传输层,然后到TLS层解密,在到HTTP应用层
关于SSL协议
是为了解决以下风险而设计的
- 所有信息都是加密传播,第三方无法窃听
- 具有校验机制,一旦被篡改,通信双方会立刻发现
- 配备身份证书,防止身份被冒充
下图为SSL协议的连接建立过程
一. 连接建立之初,首先客户端向服务端发送握手信息,这条信息里面包含两个东西
1.随机数number1
2.协商的一些加密算法(客户端支持的一些加密算法)
二. 服务端会基于客户端一个响应握手信息,里面也包含两个东西
1.随机数number2
2.匹配好的协商加密算法
三. 随即服务端又会给客户端第二个响应报文,就是服务端的证书
四. 当客户端收到这个证书后,需要对证书进行验证,就是我们常说的评估信任证书
五. 证书验证通过后,客户端会组装会话秘钥,由以下三个部分组成
1.客户端自己保留的随机数number1
2.客户端自己保留的随机数number2
3.预主秘钥
六.客户端把预主秘钥通过服务端传来的证书里面所包含的公钥加密后传递给服务端
七. 服务端就能拿到加密后的预主秘钥,再通过私钥去解密预主秘钥,此时服务端也获取到了
1.客户端自己保留的随机数number1
2.客户端自己保留的随机数number2
3.预主秘钥
八. 服务端根据上面的三个东西也组装会话秘钥,和客户端的组装方式一样
九. 客户端使用会话秘钥去加密一条消息,并把这个握手消息传给服务端,为了验证服务端是否能接收加密后的消息
十. 服务端也会发送一个加密过的握手消息给客户端,来验证客户端是否能解密
当九和十都验证通过后,客户端和服务端的SSL连接接就完成了
备注
一. 客户端如何判断服务端发来的证书是有效合法的
1.客户端要验证服务端证书的数字摘要和服务端证书解密之后的内容是否一致,来判断证书是否被篡改
2.证书链,要逐级验证服务端的证书一直到根证书,看它是否在我们操作系统的可信任证书列表当中
二. 预主秘钥
由客户端产生,传递给服务端,在会话过程中起重要作用
三. 随机数1和随机数2
为了使秘钥具有随机性,防止攻击人窃取
四. 公钥和私钥
SSL连接即使用了对称加密也使用了非对称加密
通过非对称加密对预主秘钥起到了很好的保护作用:
第六步客户端使用了公钥对预主秘钥进行加密后发给服务端
第七步服务端通过私钥去解密预主秘钥来获得内容
为什么不直接使用公钥加密私钥解密的方法去完成HTTPS呢,还要组装会话秘钥呢
因为非对称加密比较损耗性能
对称加密相比非对称加密它是高效的
所以我们在后续的网络请求响应过程中,使用的是对称加密算法,非对称加密只是在连接建立过程中去使用,主要目标是为了保证预主秘钥的安全,保证后续的对称加密的安全,这样就规避了对称加密的秘钥在网络传输中容易被截获的问题,同时又保证了高效性
对称加密:加密和解密使用的是同一把秘钥
存在的问题:秘钥需要通过网络传输给接收方,无法保证秘钥的安全
不对称加密:加密的秘钥和解密的秘钥不同,公钥加密私钥解密
私钥只由接收方保存,不在网络层传输
公钥在传输中即使被截获也没关系,因为私钥不知道
iOS中HTTPS是怎样实现的(证书验证)
iOS以下类协议可以干涉证书验证过程
NSURLSession的参数如下
1.会话
2.一次网络请求任务
3.认证挑战,携带服务端返回的证书以及相应的验证策略
4.block,一是标识认证挑战的策略,二是代表采用的认证的证书
下面分别对参数解释
NSURLSession会话
NSURLSessionConfiguration类:用来实现会话的配置信息,然后用它来创建NSURLSession
requestCachePolicy请求的缓存策略
timeoutIntervalForRequest请求的时间间隔
timeoutIntervalForResource资源的时间间隔
networkServiceType网络服务类型
allowsCellularAccess是否允许使用蜂窝网来访问
NSURLSessionTask任务创建
分以下几个
NSURLSessionDataTask能实现绝大多数网络请求
1.先创建
2,要启动
NSURLAuthenticationChallenge中的protectionSpace
当我们发起网路请求,收到服务端的回调方法,系统会为我们封装好NSURLProtectionSpace对象,为受保护区,是只读变量,在这个变量里,有个serverTrust,里面包含
1.服务端返回的证书
2.系统的默认验证策略
NSURLSessionAuthChallengeDisposition枚举
NSURLSessionAuthChallengeUseCredential = 0,是否使用证书验证
NSURLSessionAuthChallengePerformDefaultHandling = 1, 是否执行默认处理
NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,取消证书认证
NSURLSessionAuthChallengeRejectProtectionSpace = 3, 拒绝受保护区
网友评论