2017-01-05 14:14:03 wyz670083956 阅读数 1864

傲娇的苹果公司 2017.1.1之后对 APP的网络请求做了一个安全改变,也就是所谓的https(顾名思义,就是对http进行了安全加密;S:security)

先从iOS 9 的https开始说吧,iOS 9 之后,所有的网络请求都要改成HTTPS:但其实iOS 9的https只是一个过渡,所以只需要 改变xcode 里 info.plist文件的配置就好

下面提供一种方法;

1.在info.plist里加入一行:NSAppTransportSecurity  ,为字典类型(Dictionary)

2. 在字典类型下加入一个key:NSAllowsArbitraryLoads, 为Boolean类型 ,设置为YES


如下图:  (PS:以上两行代码添加进info.plist文件后,会变成 App Transport Security Settings 和 Allow Arbitrary Loads ,所以不必惊慌!!)  



再说所iOS 10,给一年多的时间过渡iOS 9,苹果现在搞真正的https啦!


2015-09-02 15:54:37 zhangwenhai001 阅读数 432
2016-09-29 09:54:04 ckl520csdn 阅读数 7931

ios 9 出来以后,苹果推荐使用https协议,来提高数据传输之间的安全性,下面将介绍,如何在工程里面配置,让AF支持https请求.


一.证书准备

  • 1.证书转换
    在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句
    // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
    这样你就可以得到cer类型的证书了。双击,导入电脑。
  • 2.证书放入工程
    1、可以直接把转换好的cer文件拖动到工程中。
    2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

二. 代码修改

  • 1先在info.plist中,增加如下图的配置

plist文件配置

使用XML格式配置plist文件内容如下 :

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

三.使用系统类发送网络请求篇

  • 3.1 NSURLConnection设置支持https。
2015年iOS9的更新中,NSURLConnection 被废弃 由 NSURLSession 取代,所以本身是不建议大家继续用这个类做网络请求的(同样也有AFNetWorking 2.x版本),但是考虑到一些旧程序,也不能说改就改,说替换就替换的,所以还是需要普及一下,如果用到了NSURLConnection你需要怎么做。

代码如下 :

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{

    if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        // 告诉服务器,客户端信任证书
        // 创建凭据对象
        NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        // 告诉服务器信任证书
        [challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
    }
}

现在,你只需要加上以上代理方法,就可有简单的使用https请求了.

  • 3.2 NSURLSession设置支持https。

现在推荐使用的就是NSURLSession来处理相关的网络请求了,如果使用系统自带的类,可以参考如下代码:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task  didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler {

    // 判断是否是信任服务器证书
    if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        // 告诉服务器,客户端信任证书
        // 创建凭据对象
        NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        // 通过completionHandler告诉服务器信任证书
        completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
    }
    NSLog(@"protectionSpace = %@",challenge.protectionSpace);
}

四.使用AFNetWorking发送网络请求

AFNetworking是一个讨人喜欢的网络库,适用于iOS以及Mac OS X. 它构建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
  • 4.1 AFNetWorking 2.x版本
    考虑到这个版本,我们还可以使用AFHTTPRequestOperationManager这个类来处理网络请求。所以我们要做的就是给这个类,设置一些参数,让它可以支持https的请求,代码如下:

//https需要校验证书,不可以被抓包

 // 1.初始化单例类
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    mgr.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
    // 2.设置证书模式
    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
    mgr.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
    // 客户端是否信任非法证书
    mgr.securityPolicy.allowInvalidCertificates = YES;
    // 是否在证书域字段中验证域名
    [mgr.securityPolicy setValidatesDomainName:NO];

//https ,不校验证书,可以抓包

 // 1.初始化单例类
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    mgr.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
    // 2.设置非校验证书模式
    mgr.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    mgr.securityPolicy.allowInvalidCertificates = YES;
    [mgr.securityPolicy setValidatesDomainName:NO];
  • 4.2 AFNetWorking 3.x版本

在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

// 支持https, 校验证书,不支持抓包


// 1.初始化单例类
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
    // 2.设置证书模式
    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
    // 客户端是否信任非法证书
    mgr.securityPolicy.allowInvalidCertificates = YES;
    // 是否在证书域字段中验证域名
    [mgr.securityPolicy setValidatesDomainName:NO];

//支持https,不校验证书,可以抓包

// 1.初始化单例类
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 2.设置非校验证书模式
    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.securityPolicy.allowInvalidCertificates = YES;
    [manager.securityPolicy setValidatesDomainName:NO];

参考文档 :iOS开发 支持https请求以及https请求的抓包

2014-11-05 01:31:43 DavyJonesWang 阅读数 530

IOS网络请求


IOS网络请求操作流程

1. 构造NSUSL对象
2. 构造NSURLRequest请
3. 调用NSURLConnection发送请求
4. 返回NSURLRespond响应对象和NSError实例对象
5. 通过NSURLRespond得到数据

//同步请求
NSURL *url = [NSURL URLWithString:  @"http://www.baidu.com/s?tn=baiduhome_pg&bs=NSRUL&f=8&rsv_bp=1&rsv_spt=1&wd=NSurl&inputT=2709"];     
NSLog(@"Scheme: %@", [url scheme]);    
NSLog(@"Host: %@", [url host]);    
NSLog(@"Port: %@", [url port]);        
NSLog(@"Path: %@", [url path]);        
NSLog(@"Relative path: %@", [url relativePath]);   
NSLog(@"Path components as array: %@", [url pathComponents]);           
NSLog(@"Parameter string: %@", [url parameterString]);      
NSLog(@"Query: %@", [url query]);          
NSLog(@"Fragment: %@", [url fragment]);  
NSLog(@"User: %@", [url user]);  
NSLog(@"Password: %@", [url password]); 

NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                          returningResponse:&response
                                                      error:&error];
//或者
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"GET"];
[request setURL:url];
[request setTimeoutInterval:60];
    
NSURLResponse *response;
//发送同步请求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

<pre name="code" class="plain">if (error == nil)
{
        // 处理数据
}

//异步请求
NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark - NSURLConnection delegate
//数据加载过程中调用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
//数据加载完成后调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
}
//数据加载失败后调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
}
//或者
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse* respone, NSData* data, NSError* error){}];

[
2019-09-18 14:40:33 Poo__Chai 阅读数 109

手机抓包的时候老是无法抓htttps,android端抓取HTTPS请求一切正常,可是在ios端抓取HTTPS请求时一直提示“此服务器的证书无效,搜索后发现,ios10.3以后,安装了证书不是默认启动的,需要从设置中手动开启,下面记录下整个操作流程以备后用。

1、安装证书

启动Safari,输入Fiddler所在机器的IP地址和端口号(如192.168.1.129:8888)打开Fiddler证书页面,点击“FiddleRoot certificate”安装证书

2、启用证书

打开设置->通用->关于本机->证书设置,将Fiddle的证书启用即可

启用Fiddler证书
好了,到这里就可以抓取HTTPS请求了

  • 小提示:Fiddler抓包经常有设置好后抓不到包的情况,可以把Fiddler重启,需要抓包的应用重启后再试试,会有惊喜

网络请求ios

阅读数 47

IOS 同步 网络请求

阅读数 1343

没有更多推荐了,返回首页