iOS適配HTTPS、開啓ATS讓你的域名更安全

馬上要到蘋果給出的到期時間了,適配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

//加載失敗
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"加載失敗-----web:%@",_urlString);
    //一個頁面沒有被完全加載之前收到下一個請求,此時迅速會出現此error,error=-999
    //此時可能已經加載完成,則忽略此error,繼續進行加載。
    if ([error code] == NSURLErrorCancelled) {
        return;
    }
    [SVProgressHUD dismiss];
}
因爲HTTPS的請求方式會稍微慢一點點導致webView加載的時候會出現類似問題(個人愚見),這樣處理可以避免次問題。

問題

在配置過程中的問題:1.證書和代碼都搞定後,請求接口返回code-999這個意思是請求取消,最後確定是證書問題。

注意:ssl證書域名裏的一個通配符只能使用一級域名,多級域名要使用多個通配符(這個就是上面的問題)。

 比如https://ddy.text.com這個是一級域名,https://ddy.api.text.com則是二級域名,如果設置的支持域名是:*.ddy.com則就是一級域名可以驗證成功。想適配這種情況有兩種方式:1.在花一千塊錢多買一個通配符的使用權限(不划算啊); 2.利用域名映射就可以解決啦。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章