AFNetworking2.0 get/post请求、使用自签证书访问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访问库,由于它是基于iOS的HTTP网络通讯库,自然证书方面的要求和系统是一致的,也就是你需要有一张合法的站点证书。

     

       正式的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,再加上ca的cer格式证书,引入到app的bundle里,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就只会比对服务器证书和内嵌证书是否一致,不会再验证证书是否和站点域名一致了。

}


转载于:https://my.oschina.net/751547752/blog/262607

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值