• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

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

    http升級至https

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

    由于蘋果規定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

    然后看到

    百度的證書分析

    那些證書機構頒發的證書能用:蘋果官方信任證書

    收費SSL證書: 網上百度一大把, 收費還挺貴的,自己可以多找幾個對比一下

    免費SSL證書: 除了收費的CA證書機構, 你還可以去騰訊云申請免費的SSL證書, 教程免費在騰訊云申請SSL證書的方法

    沃通(WoSign)免費的SSL證書最近被蘋果封殺了, 能不能用大家可以看一下蘋果的公告: 您的蘋果手機輕點“設置”>“通用”>“關于本機”>"證書信任設置">"進一步了解被信任的證書"去了解

    檢測你的接口是否滿足蘋果的ATS要求, 有以下兩種方法:

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

    騰訊云的檢測頁面

    2 終端輸入 nsurl --ats-diagnostics --verbose 你的接口地址

    大家可以參考這篇文章,里面的說的很明白:

    關于iOS9中的App Transport Security相關說明及適配(更新于2016.7.1)

    里面會詳細說明你的證書哪點不符合ATS要求

    當然下面自己制作證書去實現HTTPS的,檢測不通過的,所以我覺得審核會被拒

    這種方法配置好了, 在手機端就什么都不用配置就可以請求了

    二: 自己制作證書

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

    1

    2

    3

    1?可信的根證書用于建立信任鏈,以驗證由可信的根簽署的其他證書,例如,與?Web?服務器建立安全連接。當?IT?管理員創建?iPhone、iPad?或?iPod?touch?的配置描述文件時,無需提供這些可信的根證書。

    2?始終詢問的證書不受信任,但不受阻止。使用其中一個證書時,系統將提示您選擇是否信任該證書。

    3?已阻止的證書視為被盜用,將不再受信任。

    自制證書我覺得應該就是屬于第二種情況, 所以這種方法我也不知道能不能通過蘋果的審核, 只是提供一個方法給大家參考, 看到網上有人說可以,有人說不可以, 不到1月1號,自己沒試過都不敢說大話

    這種方式拿到后臺的接口用谷歌瀏覽器打開跟百度的證書是有區別的

    自己制作證書

    很明顯沒有綠鎖, 當打開的時候會詢問是否連接這個不受信任的連接才會進一步打開, 下面就來一步步的實現(包括怎么制作證書)

    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?*)response

    completionHandler:(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?*)challenge

    completionHandler:(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:?credential

    forAuthenticationChallenge:?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];

    returnresultDic;

    }

    @end

    下面說說我在配置自己制作證書過程中遇到的問題:

    1.轉換證書: 把后臺給你的.crt證書轉化為.cer后綴

    終端命令行openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der

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

    1

    2

    3

    4

    -?(void)URLSession:(NSURLSession?*)session?didReceiveChallenge:(NSURLAuthenticationChallenge?*)challenge

    completionHandler:(void?(^)(NSURLSessionAuthChallengeDisposition?disposition,?NSURLCredential?*?_Nullable?credential))completionHandler?{

    NSLog(@"證書認證");

    }

    這個方法的時候, 是因為后臺的傳輸協議還沒升級到TLS1.2, 叫后臺升級后就可以來到驗證證書的這個方法了.

    3.拖入證書讀取不出證書數據

    參考:https的證書錯誤,錯誤碼-1012問題及解決方案

    SDWebImage: 項目中大家用到AFN請求網絡數據, 升級驗證SSL證書的方案相信你看完上面的參考文章已經沒問題了, 我給出的代碼, 自定義網絡請求也沒問題了, 還有就是SDWebImage框架的請求HTTPS的圖片時,大家可以繞過證書驗證去加載圖片

    1

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

    希望幫到你。


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

    多一份參考,總有益處

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

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

    業務熱線:余經理:13699882642

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

    国产亚洲精品a在线观看app| 国产成人午夜精品免费视频 | 特级精品毛片免费观看| 亚洲线精品一区二区三区| 精品日产卡一卡二卡麻豆| 四虎影视永久在线精品| 国产美女在线精品观看| 999这里只有精品| 亚洲色精品vr一区二区三区| 亚洲精品一级无码中文字幕| 久久国产乱子伦免费精品| 99久久国产宗和精品1上映| 一级一级特黄女人精品毛片| 国产精品久久久久久久| 久久亚洲国产欧洲精品一| 国产乱人伦精品一区二区在线观看| 久久青草精品38国产免费| 国产手机精品视频| 久久久一本精品99久久精品66直播 | 国产精品人人爽人人做我的可爱 | 国产精品 羞羞答答在线| 揄拍成人国产精品视频| 久久99精品久久久久久久野外 | 99re在线精品视频| 久久精品福利视频| 日韩精品在线视频| 亚洲精品无码久久久影院相关影片 | 精品无码国产AV一区二区三区| 国产精品久久久久影院色| 最新69堂国产成人精品视频| 一区二区三区日韩精品| 无码人妻精品一区二区三18禁| 国产精品免费观看调教网| 精品视频在线免费观看| 国语自产少妇精品视频| 国产成人久久精品激情| 久久99精品国产99久久| 亚洲国产精品一区二区成人片国内 | 成人国产精品一区二区网站公司| 久久久精品久久久久久96| 久久人午夜亚洲精品无码区 |