iOS防Charles抓包

开发中使用代理抓网络请求很正常,那么如何防止被代理抓包呢 

可以通过CFNetwork

通过ASIHTTPRequest的属性,可以提取出代理设置

代码先搞起来

/**

 @param 判断是否设置代理

 */

+ (BOOL)getProxyStatus {

    

    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);

    NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (CFDictionaryRef)proxySettings) autorelease]);

    NSDictionary *settings = [proxies objectAtIndex:0];

    NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);

    NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);

    NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);

    if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])

    {

        //没有设置代理

        return NO;

    }

    else

    {

        //判断模拟器和测试地址了

        if ([[self deviceModelName] isEqualToString:@"Simulator"]  || [[XTKVersionStorage getModel].appSettings[@"apiHost"] containsString:@"test"]) {

            return NO;

        }

        //设置代理了

        [self showBounced];//禁止访问弹框

        return YES;

    }

}

 

/**

 @param 客户端本地做证书校验

 */

+(AFSecurityPolicy*)customSecurityPolicy

{

    // /先导入证书

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//证书的路径

    NSData *certData = [NSData dataWithContentsOfFile:cerPath];

    // AFSSLPinningModeCertificate 使用证书验证模式 (AFSSLPinningModeCertificate是证书所有字段都一样才通过认证,AFSSLPinningModePublicKey只认证公钥那一段,AFSSLPinningModeCertificate更安全。但是单向认证不能防止“中间人攻击”)

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO

    // 如果是需要验证自建证书,需要设置为YES

    securityPolicy.allowInvalidCertificates = YES;

    

    //validatesDomainName 是否需要验证域名,默认为YES;

    //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。

    

    //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。

    //如置为NO,建议自己添加对应域名的校验逻辑。

    securityPolicy.validatesDomainName = YES;

    NSSet * set = [[NSSet alloc]initWithObjects:certData  , nil];

    securityPolicy.pinnedCertificates = set;

    return securityPolicy;

}

 

你可能感兴趣的:(iOS从入门到放弃,项目开发,iOS,防抓包,Charles)