iOS 基于AFNetworking下自签名证书配置的方法

 更新时间:2018年03月21日 10:03:31   作者:雪中夜归人  
本篇文章主要介绍了iOS 基于AFNetworking下自签名证书配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

自从https推出以后,客户端对网络安全的要求程度也越来越高。甚至在iOS9之后,苹果强制要求必须支持https请求。

https是什么呢?它又是如何保证数据安全的呢?

简单来说,https就是http+TLS/SSL。就是在http上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,也就说传输中的数据都是加密的,如果不知道私钥,是无法真正知道传输内容的真正意思的。

整个https单向验证流程简单总结如下:

  1. 就是用户发起请求,服务器响应后返回一个证书,证书中包含一些基本信息和公钥。
  2. 用户拿到证书后,去验证这个证书是否合法,不合法,则请求终止。
  3. 合法则生成一个随机数,作为对称加密的密钥,用服务器返回的公钥对这个随机数加密。然后返回给服务器。
  4. 服务器拿到加密后的随机数,利用私钥解密,然后再用解密后的随机数(对称密钥),把需要返回的数据加密,加密完成后数据传输给用户。
  5. 最后用户拿到加密的数据,用一开始的那个随机数(对称密钥),进行数据解密。整个过程完成。

当然这仅仅是一个单向认证,https还会有双向认证,相对于单向认证也很简单。仅仅多了服务端验证客户端这一步。

那么在AFNetworking中,我们要完成自签名证书配置:

// 自签名证书在路径
NSString *certFilePath = [[NSBundle mainBundle] pathForResource:@"service" ofType:@"cer"];
// 自签名证书转换成二进制数据
NSData *certData = [NSData dataWithContentsOfFile:certFilePath];
// 将二进制数据放到NSSet中
NSSet *certSet = [NSSet setWithObject:certData];
/* AFNetworking中的AFSecurityPolicy实例化方法
  第一个参数:
  AFSSLPinningModeNone,  //不验证
  AFSSLPinningModePublicKey,   //只验证公钥
  AFSSLPinningModeCertificate,   //验证证书
  第二个参数:存放二进制证书数据的NSSet
*/
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certSet];
// shareManager 是继承自AFHTTPSessionManager的一个类的实例对象
sharedManager.securityPolicy = policy;

这样在请求时,如果服务器要校验自签名证书就会调用AFSecurityPolicy类中以下方法

- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust
         forDomain:(NSString *)domain

AFNetworking就是在这个方法中进行的单向验证。如果有需要双向验证的也需要重写这个方法,以实现双向验证。(双向验证在银行类等app中使用的较多)

在该方法中使用自签名证书可能会出现的一个问题就是

复制代码 代码如下:

[pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)];

这行代码有可能数组中添加了nil,即自签名证书没有获取到。

解决方法:

  1. 将后端发过来的.crt证书,修改后缀.cer,导入钥匙串。
  2. 再从钥匙串导出该证书,拉到项目里直接使用

其本质原因是后端的自签名证书需要进行base64反编码才能使用。

总结语:

通过对自签名证书这块的研究,对https有了更加深入、更深刻的认识,同时对AFNetworking中AFSecurityPolicy的源码进行了阅读和理解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • iOS App开发中导航栏的创建及基本属性设置教程

    iOS App开发中导航栏的创建及基本属性设置教程

    这篇文章主要介绍了iOS App开发中导航栏的创建及基本属性设置教程,即用UINavigationController来编写navigation,示例代码为Objective-C语言,需要的朋友可以参考下
    2016-02-02
  • Objective-C基础 自定义对象归档详解及简单实例

    Objective-C基础 自定义对象归档详解及简单实例

    这篇文章主要介绍了Objective-C基础 自定义对象归档详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • iOS实现数字倍数动画效果

    iOS实现数字倍数动画效果

    在iOS开发中,制作动画效果是最让开发者享受的环节之一,下面这篇文章主要给大家介绍了关于iOS实现数字倍数动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 总结iOS实现渐变颜色的三种方法

    总结iOS实现渐变颜色的三种方法

    这篇文章主要给大家总结了iOS实现渐变颜色的三种方法,分别是利用CAGradientLayer实现渐变、Core Graphics相关方法实现渐变以及用CAShapeLayer作为layer的mask属性实现,大家可以根据自己的需要选择使用,下面来一起看看吧。
    2016-10-10
  • iOS 11 使用两种方法替换(Method Swizzling)去掉导航栏返回按钮的文字

    iOS 11 使用两种方法替换(Method Swizzling)去掉导航栏返回按钮的文字

    这篇文章主要介绍了iOS 11 使用方法替换(Method Swizzling)去掉导航栏返回按钮的文字,需要的朋友可以参考下
    2018-05-05
  • iOS实现自定义日期选择器示例

    iOS实现自定义日期选择器示例

    本篇文章主要介绍了iOS实现自定义日期选择器示例,可以显示年月日时分,非常具有实用价值,需要的朋友可以参考下。
    2017-02-02
  • iOS tableview实现顶部拉伸效果

    iOS tableview实现顶部拉伸效果

    这篇文章主要为大家详细介绍了iOS tableview实现顶部拉伸效果,以及头部拉伸效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • iOS AFNetworking中cookie重定向代码

    iOS AFNetworking中cookie重定向代码

    这篇文章主要介绍了iOS AFNetworking中cookie重定向代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • IOS 时间和时间戳之间转化示例

    IOS 时间和时间戳之间转化示例

    我们经常从服务器后台拿到时间戳的时间,以下代码可以实现将时间戳转为可读的时间格式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • iOS通过http post上传图片

    iOS通过http post上传图片

    这篇文章主要介绍了iOS通过http post上传图片的相关资料,需要的朋友可以参考下
    2016-03-03

最新评论