生活随笔
收集整理的這篇文章主要介紹了
iOS 适配HTTPS方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一切為了迎合蘋果
在WWDC 2016開發(fā)者大會上,蘋果宣布了一個最后期限:到2017年1月1日 App Store中的所有應(yīng)用都必須啟用 App Transport Security安全功能。App Transport Security(ATS)是蘋果在iOS 9中引入的一項隱私保護(hù)功能,屏蔽明文HTTP資源加載,連接必須經(jīng)過更安全的HTTPS。蘋果目前允許開發(fā)者暫時關(guān)閉ATS,可以繼續(xù)使用HTTP連接,但到年底所有官方商店的應(yīng)用都必須強制性使用ATS。但如果2017年1月1日起您仍一意孤行那么在Apple Store中您的App將不能被用戶下載使用。
兼容HTTP
新特性要求App內(nèi)訪問的網(wǎng)絡(luò)必須使用HTTPS協(xié)議。 但是現(xiàn)在公司的項目使用的是HTTP協(xié)議,使用私有加密方式保證數(shù)據(jù)安全?,F(xiàn)在也不能馬上改成HTTPS協(xié)議傳輸,需要兼容下HTTP。 網(wǎng)絡(luò)請求報錯:The resource could not be loaded because the App Transport Security policy require:
所以先兼容下http:
在Info.plist中添加NSAppTransportSecurity類型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設(shè)為YES; 為了適配webView中的http鏈接:在NSAppTransportSecurity下添加Allow Arbitrary Loads in Web Content類型Boolean,值設(shè)為YES;
適配HTTPS
iOS開發(fā)者來說,需要盡早解決HTTPS請求的問題。
發(fā)送HTTPS請求信任SSL證書和自簽名證書,分為三種情況:
(較少的公司)如果你的app服務(wù)端安裝的是SLL頒發(fā)的CA,可以使用系統(tǒng)方法直接實現(xiàn)信任SSL證書,關(guān)于Apple對SSL證書的要求請參考:蘋果官方文檔CertKeyTrustProgGuide 示例代碼:
NSURL *URL = [NSURL URLWithString:URLString];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];//創(chuàng)建同步連接NSError *error = nil;NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; NSString *receivedInfo = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
(大部分公司)基于AFNetWorking的SSL特定服務(wù)器證書信任處理,使用自簽名證書認(rèn)證,重寫AFNetWorking的customSecurityPolicy方法。 ###驗證證書步驟: 從服務(wù)器要來.crt格式的證書,然后用Mac鑰匙串打開,然后導(dǎo)出?.cer格式的證書
把.cer證書導(dǎo)入程序的 中。 驗證證書的代碼:
/**https證書驗證*/
+(AFSecurityPolicy*)customSecurityPolicy
{// /先導(dǎo)入證書NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//證書的路徑NSData *certData = [NSData dataWithContentsOfFile:cerPath];// AFSSLPinningModeCertificate 使用證書驗證模式 (AFSSLPinningModeCertificate是證書所有字段都一樣才通過認(rèn)證,AFSSLPinningModePublicKey只認(rèn)證公鑰那一段,AFSSLPinningModeCertificate更安全。但是單向認(rèn)證不能防止“中間人攻擊”)AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO// 如果是需要驗證自建證書,需要設(shè)置為YESsecurityPolicy.allowInvalidCertificates = YES;//validatesDomainName 是否需要驗證域名,默認(rèn)為YES;//假如證書的域名與你請求的域名不一致,需把該項設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機構(gòu)頒發(fā)的證書,也可以建立連接,這個非常危險,建議打開。//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當(dāng)然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。//如置為NO,建議自己添加對應(yīng)域名的校驗邏輯。securityPolicy.validatesDomainName = NO;securityPolicy.pinnedCertificates = (NSSet *)@[certData];return securityPolicy;
}
其中的cerPath就是app bundle中證書路徑,certificate為證書名稱的宏,僅支持cer格式,securityPolicy的相關(guān)配置尤為重要,請仔細(xì)閱讀customSecurityPolicy方法并根據(jù)實際情況設(shè)置其屬性。
這樣,就能夠在AFNetWorking的基礎(chǔ)上使用HTTPS協(xié)議訪問特定服務(wù)器,但是不能信任根證書的CA文件,因此這種方式存在風(fēng)險,讀取pinnedCertificates中的證書數(shù)組的時候有可能失敗,如果證書不符合,certData就會為nil。
在發(fā)送請求時候 加上這行代碼,https ssl 驗證。
// [[AFHTTPSessionManager manager] setSecurityPolicy:[JYAFNetworkingManager customSecurityPolicy]];
更改系統(tǒng)方法,發(fā)送異步NSURLConnection請求。 這種方式用的很少就不多介紹了有新區(qū)可以自行搜索;
大部分可以參考: http://www.jianshu.com/p/f312a84a944c http://www.jianshu.com/p/6b9c8bd5005a http://www.jianshu.com/p/b03ae4a1a2d3
總結(jié)
以上是生活随笔 為你收集整理的iOS 适配HTTPS方法 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。