HTTPS 和 加密 和 AFNetworking 证书验证

一、在做加密的时候突然想到一个问题,就是我们都已经用 HTTPS 传输了,为什么还要加密呢?

既然有了这个疑惑,就抽空自己解惑了,翻阅资料,没想到零零散散看了许多方面。今天总结下。

首先来解决自己的疑惑为什么我们还要加密。

第一步来了解下 HTTPS 传输协议:

HTTPS 是两部分组成:HTTP + SSL/TSL,就是在 HTTPS 加了一层加密处理。HTTPS 的作用是对在客户端和服务器端之间的传输进行加密处理。(这句话很关键,就解答了为什么我们还要加密,因为HTTPS仅仅保护的是传输过程中的安全)。HTTPS是数据加密,对于一些端口,网址等并不进行加密处理。(对于抓包软件抓到的包是明文,因为你客户端直接通信的是抓包软件)。具体过程怎么加密和解密,如下图:

HTTPS 和 加密 和 AFNetworking 证书验证_第1张图片

1、第一步向服务器端发出请求,连接到服务器端的 443 端口。

2、采用 HTTPS 协议的服务器必须有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续方法,而使用信任的公司申请的证书则不会弹出信任弹框。这套证书分别分为公钥和私钥。公钥就是用来加密,私钥用来解密。

3、服务器将公钥放在response中传给客户端。

4、客户端就行解析(当然不需要我们操作)。由客户端的 TLS 来完成。验证公钥是否有效,颁发机构,过期时间等等。证书验证通过产生随机数,用公钥将随机数进行加密。

5、将用公钥加密过的key传给服务器。以后可以通过该key进行加密。

6、服务器通过使用私钥将用公钥加密过的key进行解密,获取客户端和服务器端都拥有的key。

7、通过用私钥解密过后的key对数据进行加密,返回给客户端。

8、客户端使用 key 将返回的数据进行解密。


二、AFSecurityPolicy

对于自制证书,在AFNetworking 请求时最好加上 SSL Pinning。

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"12306" ofType:@"cer"];//证书的路径

NSData *certData = [NSData dataWithContentsOfFile:cerPath];

NSSet *set = [NSSet setWithObject:certData];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:set;

securityPolicy.allowInvalidCertificates=YES; // 允许自建证书

securityPolicy.validatesDomainName=NO; // 是否开启域名验证

Mode::AFSSLPinningModePublicKey 防止证书过期此时要重新打包上线。

即在请求特定服务器时,AFNetworking 会对服务器传来的证书就行验证。通过则就继续请求,失败则取消请求。

对于组织申请的也可以通过 SSL Pinning 来验证,来提高被攻击的成本。

参考链接

http://nelson.logdown.com/posts/2015/04/29/how-to-properly-setup-afnetworking-security-connection/

http://io.diveinedu.com/2016/01/09/iOS%E5%BA%94%E7%94%A8%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8BHTTPS.html

https://huang303513.github.io/2017/04/26/AFNetWorking%E6%BA%90%E7%A0%81%E4%B9%8BAFSecurityPolicy.html

http://blog.csdn.net/clh604/article/details/22179907

你可能感兴趣的:(HTTPS 和 加密 和 AFNetworking 证书验证)