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

我們用http換成了https后,我們的首頁進行開發,產品要求混合開發(原生+ H5).第一個cell是原生的,第二個cell使用webView進行開發的.同樣的環境,原生數據能請求到,可是網絡加載H5的時候出現錯誤

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

原因:

iOS9 增加了新特性 App Transport Security (ATS)。詳情:App Transport Security (ATS),新特性要求 App 內訪問的網絡必須使用HTTPS協議并且改成 TLS1.2 協議進行傳輸

APP設置情況:

為了使用iOS9的新特性,我們為APP添加了證書

//不設置證書的一種情況
- (AFSecurityPolicy*)customSecurityPolicy
{
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  return securityPolicy;
}
//設置證書的一種情況
//先導入證書
    NSString *cerStr = [[NSBundle mainBundle] pathForResource:@"你的證書名稱" ofType:@"cer"];
    NSData *cerData = [NSData dataWithContentsOfFile:cerStr];
    // 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 = YES;
    NSSet *set = [[NSSet alloc] initWithObjects:cerData, nil];
    securityPolicy.pinnedCertificates = set;
    return securityPolicy;

解決辦法:

義的設置的方法,據說可以解決此問題~
講的最多的一種方法就是修改 (...)/platforms/ios/YOURAPP/YOURAPP-Info.plist 文件,添加以下代碼:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

然而原生的還是能請求到,H5還是不能請求到,不過我在AppDelegate.m 文件,添加以下代碼:

@implementation NSURLRequest(DataController) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 
@end

H5就能加載出來了.不過,info.list 文件是之前修改過的,然后就覺得是不是只需要修改 AppDelegate.m 文件就可以呢?經過驗證是不行的,必須同時修改 info.list 和 AppDelegate.m 文件才可以解決此問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Info.plist中添加NSAppTransportSecurity類型Dictionary。 在NSAppTr...
    GreenB閱讀 2,502評論 0 1
  • 很可能你的應用是與一個支持HTTPS傳輸數據的服務器交互,但是并沒有使用TLS 1.2或更高。在這種情況下,你定義...
    Www劉閱讀 3,113評論 0 5
  • 學習文章 iOS9AdaptationTips 打造安全的App!iOS安全系列之 HTTPS 概念釋疑 為了強制...
    劉大帥閱讀 3,760評論 2 19
  • 她從云層里出來, 她明亮、皎潔、美麗; 她是離鄉人兒的思念; 她是戀人們之間的情愫。 她又躲進云里, 云給她遮上層...
    無語呤咽閱讀 358評論 0 0
  • 我愛錢,我要養金鵝 21天小白訓練營快要畢業了,我就不再是小白了,耶!我以后就是一個心中有金鵝的人,一個為...
    彩華_71da閱讀 597評論 1 17