一区二区三区欧美日韩-一区二区三区欧美-一区二区三区免费在线视频-一区二区三区免费在线观看-久久精品店-久久精品第一页

歡迎您光臨深圳塔燈網絡科技有限公司!
電話圖標 余先生:13699882642

網站百科

為您解碼網站建設的點點滴滴

iOS 10 中使用HTTPS

發表日期:2016-12 文章編輯:小燈 瀏覽次數:2632

由于蘋果規定2017年1月1日以后,所有APP都要使用HTTPS進行網絡請求,否則無法上架,因此研究了一下在iOS中使用HTTPS請求的實現。網上搜索了一些比較有用資料,大家可以參考下

蘋果強制升級的HTTPS不僅僅是在接口HTTP上加個S那么簡單:
它所有滿足的是iOS9中新增App Transport Security(簡稱ATS)特性:
那滿足ATS我們需要做什么呢
1.必須是蘋果信任的CA證書機構頒發的證書
2.后臺傳輸協議必須滿足: TLS1.2 (這很重要, 后面的自制證書滿足這個條件是前提)
3.簽字算法只能是下面的一種:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
4.證書必須使用SHA256或者更好的哈希算法進行簽名,要么是2048位或者更長的RSA密鑰,要么就是256位或更長的ECC密鑰。
目前有兩種升級到HTTPS得方法:
1.第三方認證的頒發CA證書(推薦)
2.自己制作證書(這種不知道能不能滿足蘋果的審核)
一: 第三方認證的頒發CA證書
證書到底長什么樣子呢? 取個栗子:
大家請打開https://www.baidu.com
然后看到

p1034.png

那些證書機構頒發的證書能用:蘋果官方信任證書
收費SSL證書: 網上百度一大把, 收費還挺貴的,自己可以多找幾個對比一下
免費SSL證書: 除了收費的CA證書機構, 你還可以去騰訊云申請免費的SSL證書, 教程免費在騰訊云申請SSL證書的方法
沃通(WoSign)免費的SSL證書最近被蘋果封殺了, 能不能用大家可以看一下蘋果的公告: 您的蘋果手機輕點“設置”>“通用”>“關于本機”>"證書信任設置">"進一步了解被信任的證書"去了解
檢測你的接口是否滿足蘋果的ATS要求, 有以下兩種方法:

  1. 騰訊云提供的檢測頁面檢測


    p1032.png
  2. 終端輸入 nsurl --ats-diagnostics --verbose 你的接口地址
    大家可以參考這篇文章,里面的說的很明白:
    關于iOS9中的App Transport Security相關說明及適配(更新于2016.7.1)
    里面會詳細說明你的證書哪點不符合ATS要求
    當然下面自己制作證書去實現HTTPS的,檢測不通過的,所以我覺得審核會被拒
    這種方法配置好了, 在手機端就什么都不用配置就可以請求了

二 . 自己制作證書

蘋果官方信任證書里說到有三種證書:

  1. 可信的根證書用于建立信任鏈,以驗證由可信的根簽署的其他證書,例如,與 Web 服務器建立安全連接。當 IT 管理員創建 iPhone、iPad 或 iPod touch 的配置描述文件時,無需提供這些可信的根證書。
  2. 始終詢問的證書不受信任,但不受阻止。使用其中一個證書時,系統將提示您選擇是否信任該證書。
  3. 已阻止的證書視為被盜用,將不再受信任。
    自制證書我覺得應該就是屬于第二種情況, 所以這種方法我也不知道能不能通過蘋果的審核, 只是提供一個方法給大家參考, 看到網上有人說可以,有人說不可以, 不到1月1號,自己沒試過都不敢說大話
    這種方式拿到后臺的接口用谷歌瀏覽器打開跟百度的證書是有區別的
p1033.png

很明顯沒有綠鎖, 當打開的時候會詢問是否連接這個不受信任的連接才會進一步打開, 下面就來一步步的實現(包括怎么制作證書)
iOS使用自簽名證書實現HTTPS請求
iOS Https協議 自簽證書訪問數據參考這個例子的時候,博主自帶的Demo AFN框架請求不了數據, 我用了最新AFN版本的成功返回數據
還可以參考一下
iOS 10 適配 ATS app支持https通過App Store審核
我在利用原生的代碼測試時遇到的問題

 @interface ViewController ()@end @implementation ViewController - (void)viewDidLoad { } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];NSURLSessionDataTask *task =[session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }];[task resume]; } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)responsecompletionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSLog(@"接收到服務器響應"); //注意:這里需要使用completionHandler回調告訴系統應該如何處理服務器返回的數據 //默認是取消 /**NSURLSessionResponseCancel = 0,默認的處理方式,取消NSURLSessionResponseAllow = 1, 接收服務器返回的數據NSURLSessionResponseBecomeDownload = 2,變成一個下載請求NSURLSessionResponseBecomeStream 變成一個流*/ completionHandler(NSURLSessionResponseAllow); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { NSLog(@"獲取到服務段數據"); NSLog(@"%@",[self jsonToDictionary:data]); } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error { NSLog(@"請求完成%@", error); } - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challengecompletionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { NSLog(@"證書認證"); if ([[[challenge protectionSpace] authenticationMethod] isEqualToString: NSURLAuthenticationMethodServerTrust]) {do { SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust]; NSCAssert(serverTrust != nil, @"serverTrust is nil"); if(nil == serverTrust) break; /* failed */ /***導入多張CA證書(Certification Authority,支持SSL證書以及自簽名的CA),請替換掉你的證書名稱*/ NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"ca" ofType:@"cer"];//自簽名證書NSData* caCert = [NSData dataWithContentsOfFile:cerPath]; NSCAssert(caCert != nil, @"caCert is nil"); if(nil == caCert) break; /* failed */ SecCertificateRef caRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)caCert); NSCAssert(caRef != nil, @"caRef is nil"); if(nil == caRef) break; /* failed */ //可以添加多張證書 NSArray *caArray = @[(__bridge id)(caRef)]; NSCAssert(caArray != nil, @"caArray is nil"); if(nil == caArray) break; /* failed */ //將讀取的證書設置為服務端幀數的根證書 OSStatus status = SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)caArray); NSCAssert(errSecSuccess == status, @"SecTrustSetAnchorCertificates failed"); if(!(errSecSuccess == status)) break; /* failed */ SecTrustResultType result = -1; //通過本地導入的證書來驗證服務器的證書是否可信 status = SecTrustEvaluate(serverTrust, &result); if(!(errSecSuccess == status)) break; /* failed */ NSLog(@"stutas:%d",(int)status); NSLog(@"Result: %d", result); BOOL allowConnect = (result == kSecTrustResultUnspecified) || (result == kSecTrustResultProceed); if (allowConnect) {NSLog(@"success"); }else {NSLog(@"error"); } /* kSecTrustResultUnspecified and kSecTrustResultProceed are success */ if(! allowConnect) { break; /* failed */ } #if 0 /* Treat kSecTrustResultConfirm and kSecTrustResultRecoverableTrustFailure as success */ /* since the user will likely tap-through to see the dancing bunnies */ if(result == kSecTrustResultDeny || result == kSecTrustResultFatalTrustFailure || result == kSecTrustResultOtherError) break; /* failed to trust cert (good in this case) */ #endif // The only good exit point NSLog(@"信任該證書"); NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,credential); return [[challenge sender] useCredential: credentialforAuthenticationChallenge: challenge]; } while(0); } // Bad dog NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge,credential); return [[challenge sender] cancelAuthenticationChallenge: challenge];} - (NSDictionary *)jsonToDictionary:(NSData *)jsonData { NSError *jsonError; NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&jsonError]; return resultDic;} @end 

下面說說我在配置自己制作證書過程中遇到的問題:
1.轉換證書: 把后臺給你的.crt證書轉化為.cer后綴
終端命令行openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der

2.利用系統的方法來不到

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challengecompletionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { NSLog(@"證書認證"); } 

這個方法的時候, 是因為后臺的傳輸協議還沒升級到TLS1.2, 叫后臺升級后就可以來到驗證證書的這個方法了.
3.拖入證書讀取不出證書數據
參考: https的證書錯誤,錯誤碼-1012問題及解決方案
SDWebImage: 項目中大家用到AFN請求網絡數據, 升級驗證SSL證書的方案相信你看完上面的參考文章已經沒問題了, 我給出的代碼, 自定義網絡請求也沒問題了, 還有就是SDWebImage框架的請求HTTPS的圖片時,大家可以繞過證書驗證去加載圖片

[imageView sd_setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:self.placeholder options:SDWebImageAllowInvalidSSLCertificates]; 

希望幫到你。


本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.junxiaosheng.cn/20447.html
相關開發語言
 八年  行業經驗

多一份參考,總有益處

聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

咨詢相關問題或預約面談,可以通過以下方式與我們聯系

業務熱線:余經理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

  • QQ咨詢
  • 在線咨詢
  • 官方微信
  • 聯系電話
    座機0755-29185426
    手機13699882642
  • 預約上門
  • 返回頂部
主站蜘蛛池模板: 把手戳进美女尿口里动态图| 日本888 xxxx| 精品精品国产yyy5857香蕉| 国产69精品久久久久妇女| adc我们的永久网址| 91麻豆久久| 97视频在线观看免费视频| 18女下面流水不遮网站免费| 在线国产三级| 最近韩国日本免费观看mv免费版| 伊人最新网址| 最新日本免费一区| 中文字幕成人在线观看| 在线播放一区二区精品产| 在线高清电影理论片4399| 在线观看国产精美视频| 中文字幕亚洲乱码熟女在线萌芽| 高清无码中文字幕在线观看视频| 熟女理发厅| 国产精品免费久久久久影院| 动漫美女脱小内内露尿口| 91九色视频无限观看免费| 91麻豆久久| 成人18视频在线观看| 高h肉肉乳共妻| 国产乱色伦影片在线观看| 国产在线成人一区二区三区| 黄色亚洲片| 免费国产成人高清在线看软件| 内射后入在线观看一区| 日本又黄又裸一级大黄裸片| 色多多污污版免费下载安装| 无码国产成人777爽死| 亚洲蜜桃AV色情精品成人| 中国老太太xxx| seyeye高清视频在线| 国产高清亚洲日韩字幕一区| 国产综合欧美区在线| 久久亚洲AV成人无码国产漫画| 欧美大片xxxxbbbb| 四虎国产精品永久免费入口|