iOS 怎麼防止中間人攻擊(charles 抓包)

1、防止手機設置代理進行抓包

藉助於 CFNetwork 在應用從後臺進入前臺時檢測是否設置代理,若是設置代理進行彈框提示web

+ (BOOL)getProxyStatus {
    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
    NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.baidu.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
    {
        //設置代理了
        return YES;
    }
}
複製代碼
另外,對於autorelease,若是項目設置了ARC,能夠在Target-》Build Phase-》Compile Source中將相應的非ARC文件,
Compiler Flag改成-fno-objc-arc便可。
複製代碼

2、SSL Pinning(AFN+SSL Pinning)推薦

**考慮證書有效期的話就設置不一樣的 pinning mode **安全

SSL Pinning,即SSL證書綁定。經過SSL證書綁定來驗證服務器身份,防止應用被抓包。服務器

一、取到證書

客戶端須要證書(Certification file), .cer格式的文件。能夠跟服務器端索取。 若是他們給個.pem文件,要使用命令行轉換:markdown

openssl x509 -inform PEM -in name.pem -outform DER -out name.cer
複製代碼

若是給了個.crt文件,請這樣轉換:網絡

openssl x509 -in name.crt -out name.cer -outform der
複製代碼

若是啥都不給你,你只能本身動手了:ui

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

二、把證書加進項目中

把生成的.cer證書文件直接拖到你項目的相關文件夾中,記得勾選Copy items if neede和Add to targets。spa

三、參數名意思

AFSecurityPolicy SSLPinningMode AFSecurityPolicy是AFNetworking中網絡通訊安全策略模塊。它提供三種SSL Pinning Mode ]命令行

四、SSL Pinning Modes

AFSSLPinningModeNone:徹底信任服務器證書;
AFSSLPinningModePublicKey:只比對服務器證書和本地證書的Public Key是否一致,若是一致則信任服務器證書;
AFSSLPinningModeCertificate:比對服務器證書和本地證書的全部內容,徹底一致則信任服務器證書;
複製代碼

選擇那種模式呢?代理

AFSSLPinningModeCertificate:最安全的比對模式。可是也比較麻煩,由於證書是打包在APP中,若是服務器證書改變或者到期,舊版本沒法使用了,咱們就須要用戶更新APP來使用最新的證書。
AFSSLPinningModePublicKey:只比對證書的Public Key,只要Public Key沒有改變,證書的其餘變更都不會影響使用。
若是你不能保證你的用戶老是使用你的APP的最新版本,因此咱們使用AFSSLPinningModePublicKey。
複製代碼

五、使用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;
}
複製代碼
相關文章
相關標籤/搜索