1. 程式人生 > >iOS開發:對於AFNetworking HTTP轉HTTPS請求證書問題

iOS開發:對於AFNetworking HTTP轉HTTPS請求證書問題

轉載至:http://www.jianshu.com/p/551fa7482def

公司之前的請求都是HTTP的,現在要把HTTP改成HTTPS,如果我們只是單單的把http改成https,在進行網路請求的時候,會報下面的一大堆錯誤,大概意思也就是說證書無效,影響請求的安全性:

Domain=NSURLErrorDomain Code=-1202 "此伺服器的證書無效。您可能正在連線到一個偽裝成“m.dks.com”的伺服器,這會威脅到您的機密資訊的安全。" UserInfo=0x1741abb40 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1740cdd60>, NSLocalizedRecoverySuggestion=您仍要連線此伺服器嗎?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x1740520f0 "未能完成操作。(“kCFErrorDomainCFNetwork”錯誤 -1202。)", NSLocalizedDescription=此伺服器的證書無效。您可能正在連線到一個偽裝成“m.dks.com”的伺服器,這會威脅到您的機密資訊的安全。, NSErrorFailingURLKey=

https://m.dks.com//user/login!login.do, NSErrorFailingURLStringKey=https://m.dks.com//user/login!login.do, _kCFStreamErrorDomainKey=3}

我們要做的就是,從後臺那裡拿到一個.crt字尾的證書檔案,把這個檔案變成.cer字尾的檔案,我此處使用的是命令列;當然你也可以使用Mac上面的鑰匙串去訪問,讓後從政府頒發機構匯出.cer的檔案;開啟你的終端,寫下面的命令:

openssl x509 -in 後臺給的.crt -out 想要的名字.cer -outform der

然後把生成的:想要的名字.cer檔案匯入到工程中,在自己封裝AFNetworking的類中,寫如下程式碼:

+ (AFSecurityPolicy *)customSecurityPolicy
{
    //先匯入證書,找到證書的路徑
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Admin" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];

    //AFSSLPinningModeCertificate 使用證書驗證模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    //allowInvalidCertificates 是否允許無效證書(也就是自建的證書),預設為NO
//如果是需要驗證自建證書,需要設定為YES securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否需要驗證域名,預設為YES; //假如證書的域名與你請求的域名不一致,需把該項設定為NO;如設成NO的話,即伺服器使用其他可信任機構頒發的證書,也可以建立連線,這個非常危險,建議開啟。 //置為NO,主要用於這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上註冊的域名是www.google.com,那麼mail.google.com是無法驗證通過的;當然,有錢可以註冊萬用字元的域名*.google.com,但這個還是比較貴的。 //如置為NO,建議自己新增對應域名的校驗邏輯。 securityPolicy.validatesDomainName = NO; NSSet *set = [[NSSet alloc] initWithObjects:certData, nil]; securityPolicy.pinnedCertificates = set; return securityPolicy; }

然後在封裝的get請求或者是是post請求的地方,呼叫上面的這段程式碼:

+ (void)postWithURLString:(NSString *)urlString
               parameters:(id)parameters
                  success:(SuccessBlock)successBlock
                  failure:(FailureBlock)failureBlock
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.requestSerializer.timeoutInterval = outTime;
    //HTTPS SSL的驗證,在此處呼叫上面的程式碼,給這個證書驗證;
    [manager setSecurityPolicy:[SYNetworkingManager customSecurityPolicy]];
    [manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (successBlock) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
            successBlock(dic);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failureBlock) {
            failureBlock(error);
            NSLog(@"網路異常 - T_T%@", error);
        }
    }];
}

當我們的工程中有SDWebimage這個第三放庫的時候,載入HTTPS的圖片時,在iOS8上面沒有問題,但是在iOS9上面,控制檯就會報這樣的錯誤:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

大概意思也是說網路請求證書的問題,不過我還沒有解決這個問題,在網上找了好多,沒有找到一個好的方法,如果有哪位朋友遇到這樣的問題了,還希望可以在此處給解答一下,千恩萬謝!!!



文/First灬DKS(簡書作者)
原文連結:http://www.jianshu.com/p/551fa7482def


相關推薦

iOS開發對於AFNetworking HTTPHTTPS請求證書問題

轉載至:http://www.jianshu.com/p/551fa7482def 公司之前的請求都是HTTP的,現在要把HTTP改成HTTPS,如果我們只是單單的把http改成https,在進行網路請求的時候,會報下面的一大堆錯誤,大概意思也就是說證書無效,影響請求的安

iOS開發《使用系統自帶的UIActivityViewController和UIActivity進行內容分享》

目錄 簡介 這段時間有很多朋友都問我關於怎麼去整合ShareSDK或者友盟社會化分享SDK的問題, 其實我想說, Apple一開始就提供了一個類, 供我們去使用分享了, 在iOS 6之後更加增強了這個類, 使我們不再需要整合第三方的, 而且還支援自定義分享的item. 作者感言 在我寫這篇文章的時

iOS開發iOS設計模式 — 代理模式》

目錄 作者感言 簡介 建立工程 建立代理類 宣告代理類 代理與協議 建立協議 建立顧客類 補充一點 最後總結 作者感言 上次我們知道了單例模式是怎麼回事, 現在我們來探討一下什麼叫做單例模式. 其實所謂的代理模式在我們日常生活中非常的常見, 比如買車, 各式各樣的牌子都有, 但這些汽車生產商又

ios開發怎麼實現點選一個按鈕,跳到一個新的介面,並回退到上一介面

iOS三種檢視切換的原理各不相同:UITabBarController:以平行的方式管理檢視,各個檢視之間往往關係並不大,每個加入到UITabBarController的檢視都會進行初始化即使當前不顯示在介面上,相對比較佔用記憶體。UINavigationControlle

iOS開發GitHub上傳程式碼錯誤提示fatal: Authentication failed for 'https://gitee.com/XXX/XXX.git/‘的解決方法

上傳程式碼到Git上面,有時候會遇到各種情況,有些時候是因為合併程式碼衝突,有些時候是因為修改了Git的登入密碼需要重新認證。那麼這裡就來講解錯誤提示fatal: Authentication failed for 'https://gitee.com/XXX/XXX.git

iOS開發在iOS9中https設定info.plist的步驟

在iOS開發中,Xcode 7.0也就是iOS9.0中開發中要求App內訪問的網路必須使用HTTPS協議,以此來提高資料傳輸之間的安全性。        那麼新建立的專案沒用採用https怎麼設定?如果發現在網路請求失敗,Xcode後臺報錯資訊為:  The resource

OpenCV iOS開發(一)——安裝()

osi ctu ren png object-c 下載 eww load 信息 OpenCV是一個開源跨平臺的的計算機視覺和機器學習庫,可以用來做圖片視頻的處理、圖形識別、機器學習等應用。本文將介紹OpenCV iOS開發中的Hello World起步。

httphttps的各種應用

tar .com com htm tps targe content target lan http://www.lccee.com/content-57.html https://www.gworg.com/ssl/127.htmlhttp轉https的各種應用

阿裏雲 負載均衡 HTTPHTTPS

路由 域名 信息 cer detail del ali 負載均衡 search 一、相關文檔   1、證書服務   2、簡單路由-HTTP 協議變為 HTTPS 協議 二、阿裏雲操作界面   1、雲盾證書服務管理控制臺(查詢CA證書服務)   2、負載均衡管理控制臺 三、相

Apache 配置 http https

apache 配置 bsp iter ont pre write tee In ase <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{SERVER_POR

SpringBoot 2 HTTPHTTPS

div TP rect public ats servle security onf tex @Bean public TomcatServletWebServerFactory servletContainer() { TomcatServletWebServe

iOS開發UILabel字號根據屏幕縮放

control after call git 步驟 obj gin begin follow 場景: 假設我們有這樣一個需求,iPhone 6(屏幕寬度為375pt)上的設計圖上的字號為17pt,iPhone 6 Plus上的字號根據屏幕寬度縮放,即字號為(17pt x 4

iOS 開發Method Swizzling

是個 不足 沒有 int from ios 開發 解決方案 它的 nslog iOS 開發之Method Swizzling 前言 如果你還不知道什麽是Method Swizzling,你可以看看NSHipster 的文章 ,我簡單介紹一下,method swizzling

iOS 開發 解決Xcode7.3 不能自動索引標頭檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak

iOS 開發CocoaPods 安裝及問題 ERROR: Error installing cocoapods: activesupport requires Ruby version>=2.2.2

iOS 開發:CocoaPods 安裝以及 ERROR:  Error installing cocoapods: activesupport requires Ruby version >= 2.2.2. 今天用新的Mac筆記本安裝coco

iOS開發UITableview的多選功能實現

一、 先看效果: 最近專案中要運用即時通訊實現群組功能, 在建立群時需要選擇新增多個成員: 二、思路: 第一次點選cell選中, 再次點選取消選中; 三、方法: 只需要設定兩個屬性, 操作兩個方法即可; 1、UITableview 自帶多選功能: //允許多選 _

iOS開發環信整合步驟以及常見錯誤

環信官方文件 一、整合: 下載SDK手動整合或者CocoaPod終端整合: 下載SDK 匯入檔案以及依賴庫: 關閉Bitcode: Build Settings → Linking → Enable Bitcode 中設定 NO。 二、常

iOS開發字典(NSDictionary)和陣列( NSArray)轉換成字串

概述: 在專案開發中,總是與伺服器進行著介面的互動,傳參是不可缺少的一部分。後臺返回的j son資料我們可以很好的解析使用,但是我們如何向後臺傳送j son資料的引數呢?要知道,一般伺服器是不允許傳物件的。以下是在專案中遇到的實際問題,在此總結一下,供大家交流。 一. 字典轉字串:

iOS開發發出系統的聲音!發出自己的聲音!

這個連結非常詳盡地列舉了IOS7裡面所有的系統聲音,聲音的ID,聲音的存放位置 儘管現在已經是ios8的時代,但是系統聲音這個東東不會因此過時,畢竟聲音就那幾十種,不會一下子有太大變化。 https://github.com/TUNER88/iOSSystemSou

iOS開發UILabel字號根據螢幕縮放

場景: 假設我們有這樣一個需求,iPhone 6(螢幕寬度為375pt)上的設計圖上的字號為17pt,iPhone 6 Plus上的字號根據螢幕寬度縮放,即字號為(17pt x 414pt / 375pt)= 18.768pt 解決方案: 如果一個一個設定太麻煩,容易遺漏,這時候我們採用 runtime