白酒清茶无别事
我在等风也等你

iOS AFNetworking 添加https证书校验 防止中间人攻击

AFNetworking 添加证书校验 实现单向认证 防止第三方嗅探数据

       刚刚领导要求客户端对https进行校验,防止中间人嗅探分析数据。考量了下,进行单向认证节省时间,也不需要服务器那边进行任何配置。毕竟只让我们自己动手的,不麻烦别人是最快的。那何为单向认证呢?其实就是客户端对服务器的证书和域名进行校验。

       首先,后台那边会给你一个HTTPS的证书,格式是.cer的,如果是其他格式,自己转换成.cer格式。拖到自己的项目里面。项目的请求框架用的是AFNetworking,另外说下,AFHTTPSessionManager 这个管理类对象需要自己写成单例的方式,不然会内存泄漏。虽然他的初始化方法没有initnew。(我这应该是废话,毕竟能看到这篇文章的,都应该不是小白了)。我们改造下 AFHTTPSessionManager 的单例初始化方法。

dispatch_once(&once, ^{

        //如果是带证书校验的,AFHTTPSessionManager 的初始化方法一定要带上根域名 例如https://www.baidu.com

        _maneger = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:BaseURL]];

        _maneger.requestSerializer.timeoutInterval = 20.0f;//请求等待时间

        ((AFJSONResponseSerializer *)_maneger.responseSerializer).removesKeysWithNullValues = YES;//移除nill类型字符串

        _maneger.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/plain",@"text/javascript",@"multipart/form-data", nil];//可接受文件类型

        /*配置https证书*/

        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你的证书名字" ofType:@"cer"];//获取证书路径

        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];//转成二进制数据

        NSSet *dataSet = [[NSSet alloc] initWithObjects:cerData, nil];//可添加多个证书,我这边只有一个,仅添加一个

        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:dataSet];//AFNetworking中管理证书的一个类

        [securityPolicy setPinnedCertificates:dataSet];//设置证书文件

        [securityPolicy setAllowInvalidCertificates:NO];//是否允许无效证书

        [securityPolicy setValidatesDomainName:YES];//是否允验证域名

        _maneger.securityPolicy = securityPolicy;

        AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager manager];

        [netManager startMonitoring];

        [netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

            if (status == AFNetworkReachabilityStatusNotReachable) {

                //无网络

            }else if (status == AFNetworkReachabilityStatusReachableViaWWAN){

                //移动网络

            }else if (status == AFNetworkReachabilityStatusReachableViaWiFi){

                //wifi

            }else if (status == AFNetworkReachabilityStatusUnknown){

                //未知网络

            }

        }];

    });

赞(1) 打赏
未经允许不得转载:吾日三省吾身 » iOS AFNetworking 添加https证书校验 防止中间人攻击
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏