AFNetworking2.0 get/post请求、使用自签证书访问HTTPS
AFNetworking2.0 get/post请求、使用自签证书访问HTTPS
少年coder 发表于4年前
AFNetworking2.0 get/post请求、使用自签证书访问HTTPS
  • 发表于 4年前
  • 阅读 526
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 今天终于鼓足勇气告别ASI 使用AFNetworking、使用自签证书访问HTTPS

1,必备系统库CFNetwork.frameworkSecurity.frameworkSystemConfiguration.frameworkMobileCoreServices.framework

2,导入AFNetworking 当然 UIKit+AFNetworking这个还是挺有用的  用不用随便

3,#import "AFNetworking.h"

4, manager.responseSerializer.acceptableContentTypes = nil;//不是提交json  xml什么的时候一定要加上 否则erro不解释 另外//http://blog.csdn.net/marujunyy/article/details/18424711 可以详细学习一下

- (void)getAFNetWorking{

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    manager.responseSerializer.acceptableContentTypes = nil;

    NSString *urlpath = @"http://www.innouni.com/zwjk_app_server/?c=app&a=login&userName=15068821319&password=123456";

    [manager GET:urlpath parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"JSON: %@", responseObject);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"Error: %@", error);

    }];

}


- (void)postAFNetWorking{

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    manager.responseSerializer.acceptableContentTypes = nil;

    NSString *urlpath = @"http://www.innouni.com/zwjk_app_server/?c=app&a=login";

    NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"15068821319",@"userName",@"123456",@"password", nil];

    [manager POST:urlpath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"JSON: %@", responseObject);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"Error: %@", error);

    }];

}


    /*绝大部分iOS程序的后台服务都是基于RESTful或者WebService的,不论在任何时候,你都应该将服务置于HTTPS上,因为它可以避免中间人攻击的问题,还自带了基于非对称密钥的加密通道!现实是这些年涌现了大量速成的移动端开发人员,这些人往往基础很差,完全不了解加解密为何物,使用HTTPS后,可以省去教育他们各种加解密技术,生活轻松多了。

     

       使用HTTPS有个问题,就是CA证书。缺省情况下,iOS要求连接的HTTPS站点必须为CA签名过的合法证书,AFNetworking是个iOS上常用的HTTP访问库,由于它是基于iOSHTTP网络通讯库,自然证书方面的要求和系统是一致的,也就是你需要有一张合法的站点证书。

     

       正式的CA证书非常昂贵,很多人都知道,AFNetworking2只要通过下面的代码,你就可以使用自签证书来访问HTTPS*/

    

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];

    securityPolicy.allowInvalidCertificates = YES;

     /* 这么做有个问题,就是你无法验证证书是否是你的服务器后端的证书,给中间人攻击,即通过重定向路由来分析伪造你的服务器端打开了大门。

      

        解决方法。AFNetworking2是允许内嵌证书的,通过内嵌证书,AFNetworking2就通过比对服务器端证书、内嵌的证书、站点域名是否一致来验证连接的服务器是否正确。由于CA证书验证是通过站点域名进行验证的,如果你的服务器后端有绑定的域名,这是最方便的。将你的服务器端证书,如果是pem格式的,用下面的命令转成cer格式

      openssl x509 -in <你的服务器证书>.pem -outform der -out server.cer

      然后将生成的server.cer文件,如果有自建ca,再加上cacer格式证书,引入到appbundle里,AFNetworking2*/

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy AFSSLPinningModeCertificate];

    //或者

    //AFSecurityPolicy *securityPolicy = [AFSecurityPolicy AFSSLPinningModePublicKey];

    securityPolicy.allowInvalidCertificates = YES; //还是必须设成YES ,会自动扫描bundle.cer的文件,并引入,这样就可以通过自签证书来验证服务器唯一性了。

    

    

    

      //我前面说过,验证站点证书,是通过域名的,如果服务器端站点没有绑定域名(万恶的备案),仅靠IP地址上面的方法是绝对不行的。怎么办?答案是想通过设置是不可以的,你只能修改AFNetworking2的源代码!打开AFSecurityPolicy.m文件,找到方法:

    

    

    - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust

forDomain:(NSString *)domain{

    //            SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates);

    //

    //            if (!AFServerTrustIsValid(serverTrust)) {

    //                return NO;

    //            }

    //

    //            if (!self.validatesCertificateChain) {

    //                return YES;

    //            }

    //这样,AFSecurityPolicy就只会比对服务器证书和内嵌证书是否一致,不会再验证证书是否和站点域名一致了。

}


共有 人打赏支持
粉丝 7
博文 28
码字总数 5105
×
少年coder
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: