前言
iOS 9 開始揭保,蘋果就引入App Transport Security (ATS)谆棺,iOS9.0SDK在編譯的時候,默認所有從NSURLConnection暂氯、CFURL和NSURLSession發(fā)出的http請求潮模,都改為https請求。由于AFNetworking版本底層是用了NSURLConnection痴施,所以使用AFNetworking的app都將受到影響擎厢。但是我們可以通過以下三種方案解決
方案一:
讓服務器更新(最佳),因為繼續(xù)使用http辣吃,可能存在竊聽动遭、篡改、冒充的風險神得,而更新使用https協(xié)議后厘惦。將避免這些風險,但是代價比較大..<( ̄3 ̄)>
方案二:
在Info.plist中添加 NSAppTransportSecurity 類型 Dictionary 哩簿。
在 NSAppTransportSecurity下添加 NSAllowsArbitraryLoads 類型 Boolean ,值設為 YES
使用這一方法繞過了蘋果的ATS宵蕉,但是終究不是解決之道,在之后iOS 10推出之后节榜,蘋果官方明確表示2017/01/01開始上架的應用羡玛,均要求使用https協(xié)議,通過AllowsArbitraryLoads 置為YES繞過ATS的應用會被拒宗苍。
方案三:
將訪問的域名稼稿,加入白名單
1.在info.plist中增加一個key:NSAppTransportSecurity,類型為字典類型讳窟。
2.然后添加一個NSExceptionDomains渺杉,其類型是字典類型。
3.把需要支持的域給添加到NSExceptionDomains里挪钓,其中域作為key,類型為字典類型耳舅。
4.每個域下面需要設置3個屬性碌上,分別為NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy浦徊、NSExceptionAllowsInsecureHTTPLoads馏予,均為Boolean類型,其值分別為YES盔性,NO霞丧,YES。
新浪微博的域:weibo.com冕香、weibo.cn蛹尝、sina.com.cn后豫。微信的域:qq.com。QQ/QZone的域:qq.com
在AFNetworking 對數(shù)據(jù)進行https ssl加密
web服務器提供crt證書突那,在項目中使用的是cer證書挫酿,so,需要進行轉換
1.使用openssl 進行轉換
openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
2.通過安裝crt文件愕难,電腦導出
使用鑰匙串安裝.crt證書早龟,在導出為.cer證書
使用https ssl加密
第一步:新增一個類 獲取證書
+ (AFSecurityPolicy*)customSecurityPolicy{
// /先導入證書
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"yourcer" ofType:@"cer"];
//證書的路徑
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
// 如果是需要驗證自建證書猫缭,需要設置為YES securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名葱弟,默認為YES;
//假如證書的域名與你請求的域名不一致猜丹,需把該項設置為NO芝加;如設成NO的話,即服務器使用其他可信任機構頒發(fā)的證書居触,也可以建立連接妖混,這個非常危險,建議打開轮洋。 //置為NO制市,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名弊予。因為SSL證書上的域名是獨立的祥楣,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的汉柒;當然误褪,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的碾褂。
//如置為NO兽间,建議自己添加對應域名的校驗邏輯。
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
第二步:直接在請求方法里加入正塌,只有一行代碼
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure{
// 1.獲得請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.申明返回的結果是text/html類型
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
// 加上這行代碼嘀略,https ssl 驗證。
//[mgr setSecurityPolicy:[self customSecurityPolicy]];
// 3.發(fā)送POST請求
[mgr POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObj) {
if (success)
{
success(responseObj);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure)
{
failure(error);
}
}];}
接下來抓包抓出來的數(shù)據(jù)乓诽,都已經(jīng)加密了帜羊。