这次主要看一下文件夹Security中的类AFSecurityPolicy----安全策略类。
AFSecurityPolicy主要的作用是验证HTTPS请求证书的有效性,在iOS9之后,默认不能发送HTTP请求,如果想要发送HTTP请求,需要在plist里边设置NSAppTransportSecurity
的NSAllowsArbitraryLoads为true,这样就可以支持HTTP请求。
首先还是看一下.h文件
可以看到一个枚举,表示SSL Pinning的模式,如下
`AFSSLPinningModeNone`----Do not used pinned certificates to validate servers.
`AFSSLPinningModePublicKey`----Validate host certificates against public keys of pinned certificates.
`AFSSLPinningModeCertificate`----Validate host certificates against pinned certificates.
第一个,在证书列表中校验服务端返回的证书
第二个,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥
第三个,客户端要有服务端的证书拷贝,第一步先验证证书域名或有效期等信息,第二步对服务端返回的证书和客户端返回的是否一致。
这个是证书集合,泛型里面表示了集合里面是NSData类型,表明这个是用来存证书数据的集合,这些证书根据SSL Pinning模式来和服务器进行校验,默认是没有证书的,我们需要调用+ certificatesInBundle:方法将bundle里面的证书文件转成里面是data类型的集合。
还有两个属性
是否信任带有一个无效或者过期的SSL证书的服务器,默认不信任。
是否验证在证书的CN范围的域名,默认是。
接下来看一下.m中的初始化方法
一.这种是默认策略,AFSSLPinningModeNone
二.自定义一个安全策略,然后读取cer文件放到集合里面
设置证书的时候,就是把上面初始化时传入的证书取出公钥(在for循环中获取),再把公钥保存到mutablePinnedPublicKeys集合中。
取出公钥的方法如下 (内部静态方法)
取出证书SecCertificateRef---生成证书数组---生成SecPolicyRef---从SecPolicyRef中取出公钥---最后释放一些资源。
这个方法用来验证服务端是否是受信的
如有转载,请注明出处