iOS適配HTTPS、開啟ATS讓你的域名更安全
阿新 • • 發佈:2019-02-13
馬上要到蘋果給出的到期時間了,適配HTTPS提上了日程。
蘋果在2016年6月份的釋出會上提出2017年的1月1日,所有AppStore的APP必須要開啟ATS(也就是使用HTTPS)。適配HTTPS其實前端並不需要很多的工作量,下面我就說一下我的適配之路,供大家參考。
開通SSL
如果是自己測試可以申請免費的,公司用的話最好是購買付費SSL證書,這一部分後臺人員就可以搞定了。
客戶端
客戶端適配https,也就是啟用ATS特性需要做的事
1.獲取具有ATS特性的驗證證書,後臺人員可以給或者直接在pc域名上的鎖標誌把證書拉下來;
2.修改後臺適配好的域名http->https;
3. 修改info.plist檔案AppTransportSecuritySettings,適配https;
4.AFHTTPSessionManager例項配置https程式碼;
5.webView新增防止請求撤銷程式碼;
話不多說上程式碼NSString *url = @"https://api"; //1.獲取站點證書 NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"ssl_bundle" ofType:@".cer"]; NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; NSSet *cerSet = [NSSet setWithObjects:cerData, nil]; //2.https配置 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //allowInvalidCertificates 是否信任伺服器無效(也就是自建證書)或過期的SSL證書。預設為“不”。 //需要自建證書則預設YES,測試的時候可以關閉,正式的開啟 securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否驗證域名。預設為“是”。 建議開啟 securityPolicy.validatesDomainName = YES; //3.新增證書 [securityPolicy setPinnedCertificates:cerSet]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //4.配置https manager.securityPolicy = securityPolicy; [manager GET:url parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"進度:%f",1.0 * downloadProgress.completedUnitCount/downloadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失敗:%@",error); }];
UIWebView
因為HTTPS的請求方式會稍微慢一點點導致webView載入的時候會出現類似問題(個人愚見),這樣處理可以避免次問題。//載入失敗 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { NSLog(@"載入失敗-----web:%@",_urlString); //一個頁面沒有被完全載入之前收到下一個請求,此時迅速會出現此error,error=-999 //此時可能已經載入完成,則忽略此error,繼續進行載入。 if ([error code] == NSURLErrorCancelled) { return; } [SVProgressHUD dismiss]; }
問題
在配置過程中的問題:1.證書和程式碼都搞定後,請求介面返回code-999這個意思是請求取消,最後確定是證書問題。注意:ssl證書域名裡的一個萬用字元只能使用一級域名,多級域名要使用多個萬用字元(這個就是上面的問題)。
*.ddy.com則就是一級域名可以驗證成功。想適配這種情況有兩種方式:1.在花一千塊錢多買一個萬用字元的使用許可權(不划算啊); 2.利用域名對映就可以解決啦。