網絡安全對於一個程序員來說是一個重要的課題,實現ssl網關認證,保證網絡傳輸的安全性是每一個程序員應有的技能。廢話少說上碼。。。
1.如果想跳過ssl驗證的話
AFHTTPSessionManager * client = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]];[[client securityPolicy] setAllowInvalidCertificates:YES];
2.加入ssl證書
一般來講如果app用了web service , 我們需要防止數據嗅探來保證數據安全.通常的做法是用ssl來連接以防止數據抓包和嗅探
其實這麼做的話還是不夠的.我們還需要防止中間人攻擊(不明白的自己去百度)。攻擊者通過僞造的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:@"網站的url" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary* responseObject) { //這裏是你自己的代碼了 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //註釋同上 }];