likes
comments
collection
share

iOS 怎么防止中间人攻击(charles 抓包)

作者站长头像
站长
· 阅读数 33

一、防止手机设置代理进行抓包

借助于 CFNetwork 在应用从后台进入前台时检测是否设置代理,如果设置代理进行弹框提示

+ (BOOL)getProxyStatus {
    NSDictionary *proxySettings = (__bridge NSDictionary *)((__bridge CF_CONSUMED CFTypeRef)((__bridge NSDictionary *)CFNetworkCopySystemProxySettings()));

    NSArray *proxies = (__bridge NSArray *)((__bridge CF_CONSUMED CFTypeRef)((__bridge NSArray *)CFNetworkCopyProxiesForURL((__bridge CFURLRef)[NSURL URLWithString:@"http://www.baidu.com"], (__bridge CFDictionaryRef)proxySettings)));
    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
    {
        //设置代理了
        return YES;
    }
}
另外,对于autorelease,如果项目设置了ARC,可以在Target-》Build Phase-》Compile Source中将相应的非ARC文件,
Compiler Flag改为-fno-objc-arc即可。

二、SSL Pinning(AFN+SSL Pinning)推荐

**考虑证书有效期的话就设置不同的 pinning mode **

SSL Pinning,即SSL证书绑定。通过SSL证书绑定来验证服务器身份,防止应用被抓包。

1、取到证书

客户端需要证书(Certification file), .cer格式的文件。可以跟服务器端索取。 如果他们给个.pem文件,要使用命令行转换:

openssl x509 -inform PEM -in name.pem -outform DER -out name.cer

如果给了个.crt文件,请这样转换:

openssl x509 -in name.crt -out name.cer -outform der

如果啥都不给你,你只能自己动手了:

openssl s_client -connect www.website.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer**

2、把证书加进项目中

把生成的.cer证书文件直接拖到你项目的相关文件夹中,记得勾选Copy items if neede和Add to targets。

3、参数名意思

AFSecurityPolicy SSLPinningMode AFSecurityPolicy是AFNetworking中网络通信安全策略模块。它提供三种SSL Pinning Mode ]

4、SSL Pinning Modes

AFSSLPinningModeNone:完全信任服务器证书;
AFSSLPinningModePublicKey:只比对服务器证书和本地证书的Public Key是否一致,如果一致则信任服务器证书;
AFSSLPinningModeCertificate:比对服务器证书和本地证书的所有内容,完全一致则信任服务器证书;

选择那种模式呢?

AFSSLPinningModeCertificate:最安全的比对模式。但是也比较麻烦,因为证书是打包在APP中,如果服务器证书改变或者到期,旧版本无法使用了,我们就需要用户更新APP来使用最新的证书。
AFSSLPinningModePublicKey:只比对证书的Public Key,只要Public Key没有改变,证书的其他变动都不会影响使用。
如果你不能保证你的用户总是使用你的APP的最新版本,所以我们使用AFSSLPinningModePublicKey。

5、使用AFSecurityPolicy设置SLL Pinning

+ (AFHTTPSessionManager *)manager
{
    static AFHTTPSessionManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:[AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]];
        manager.securityPolicy = securityPolicy;
    });
    return manager;
}
转载自:https://juejin.cn/post/6964011870554439693
评论
请登录