一般來講如果app用了web service , 我們需要防止數(shù)據(jù)嗅探來保證數(shù)據(jù)安全.通常的做法是用ssl來連接以防止數(shù)據(jù)抓包和嗅探
其實這么做的話還是不夠的.我們還需要防止中間人攻擊(不明白的自己去百度)。攻擊者通過偽造的ssl證書使app連接到了偽裝的假冒的服務器上,這是個嚴重的問題!
那么如何防止中間人攻擊呢?
首先web服務器必須提供一個ssl證書,需要一個 .crt 文件,然后設置app只能連接有效ssl證書的服務器。
在開始寫代碼前,先要把 .crt 文件轉成 .cer 文件,然后在加到xcode 里面
openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
如果你用的是NSURLConnection,你需要這樣檢查證書,必須添加一個 NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge用 AFNetworking 2.x的話就簡單多了,只需要添加一個AFSecurityPolicy 和 setAFHTTPRequestOperationManager
要經常用的話,推薦寫一個方法,然后以后用就可以復制黏貼了
- (AFSecurityPolicy*)customSecurityPolicy{ /**** SSL Pinning ****/ NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你的證書" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; [securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setPinnedCertificates:@[certData]]; [securityPolicy setSSLPinningMode:AFSSLPinningModeCertificate]; /**** SSL Pinning ****/ return securityPolicy;}
然后在管理器里這么設置
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; /**** SSL Pinning ****/ [manager setSecurityPolicy:[self customSecurityPolicy]]; /**** SSL Pinning ****/ [manager GET:@"網(wǎng)站的url" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary* responSEObject) { //這里是你自己的代碼了 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //注釋同上 }];
文章地址:http://m.survivalescaperooms.com/koujiaonuhan/p/ssl-pinning-with-afnetworking-2x.html
新聞熱點
疑難解答