iOS 基于AFNetworking下自簽名證書配置的方法
自從https推出以后,客戶端對(duì)網(wǎng)絡(luò)安全的要求程度也越來(lái)越高。甚至在iOS9之后,蘋果強(qiáng)制要求必須支持https請(qǐng)求。
https是什么呢?它又是如何保證數(shù)據(jù)安全的呢?
簡(jiǎn)單來(lái)說(shuō),https就是http+TLS/SSL。就是在http上又加了一層處理加密信息的模塊。服務(wù)端和客戶端的信息傳輸都會(huì)通過(guò)TLS進(jìn)行加密,也就說(shuō)傳輸中的數(shù)據(jù)都是加密的,如果不知道私鑰,是無(wú)法真正知道傳輸內(nèi)容的真正意思的。
整個(gè)https單向驗(yàn)證流程簡(jiǎn)單總結(jié)如下:
- 就是用戶發(fā)起請(qǐng)求,服務(wù)器響應(yīng)后返回一個(gè)證書,證書中包含一些基本信息和公鑰。
- 用戶拿到證書后,去驗(yàn)證這個(gè)證書是否合法,不合法,則請(qǐng)求終止。
- 合法則生成一個(gè)隨機(jī)數(shù),作為對(duì)稱加密的密鑰,用服務(wù)器返回的公鑰對(duì)這個(gè)隨機(jī)數(shù)加密。然后返回給服務(wù)器。
- 服務(wù)器拿到加密后的隨機(jī)數(shù),利用私鑰解密,然后再用解密后的隨機(jī)數(shù)(對(duì)稱密鑰),把需要返回的數(shù)據(jù)加密,加密完成后數(shù)據(jù)傳輸給用戶。
- 最后用戶拿到加密的數(shù)據(jù),用一開始的那個(gè)隨機(jī)數(shù)(對(duì)稱密鑰),進(jìn)行數(shù)據(jù)解密。整個(gè)過(guò)程完成。
當(dāng)然這僅僅是一個(gè)單向認(rèn)證,https還會(huì)有雙向認(rèn)證,相對(duì)于單向認(rèn)證也很簡(jiǎn)單。僅僅多了服務(wù)端驗(yàn)證客戶端這一步。
那么在AFNetworking中,我們要完成自簽名證書配置:
// 自簽名證書在路徑 NSString *certFilePath = [[NSBundle mainBundle] pathForResource:@"service" ofType:@"cer"]; // 自簽名證書轉(zhuǎn)換成二進(jìn)制數(shù)據(jù) NSData *certData = [NSData dataWithContentsOfFile:certFilePath]; // 將二進(jìn)制數(shù)據(jù)放到NSSet中 NSSet *certSet = [NSSet setWithObject:certData]; /* AFNetworking中的AFSecurityPolicy實(shí)例化方法 第一個(gè)參數(shù): AFSSLPinningModeNone, //不驗(yàn)證 AFSSLPinningModePublicKey, //只驗(yàn)證公鑰 AFSSLPinningModeCertificate, //驗(yàn)證證書 第二個(gè)參數(shù):存放二進(jìn)制證書數(shù)據(jù)的NSSet */ AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certSet]; // shareManager 是繼承自AFHTTPSessionManager的一個(gè)類的實(shí)例對(duì)象 sharedManager.securityPolicy = policy;
這樣在請(qǐng)求時(shí),如果服務(wù)器要校驗(yàn)自簽名證書就會(huì)調(diào)用AFSecurityPolicy類中以下方法
- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust
forDomain:(NSString *)domain
AFNetworking就是在這個(gè)方法中進(jìn)行的單向驗(yàn)證。如果有需要雙向驗(yàn)證的也需要重寫這個(gè)方法,以實(shí)現(xiàn)雙向驗(yàn)證。(雙向驗(yàn)證在銀行類等app中使用的較多)
在該方法中使用自簽名證書可能會(huì)出現(xiàn)的一個(gè)問(wèn)題就是
[pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)];
這行代碼有可能數(shù)組中添加了nil,即自簽名證書沒(méi)有獲取到。
解決方法:
- 將后端發(fā)過(guò)來(lái)的.crt證書,修改后綴.cer,導(dǎo)入鑰匙串。
- 再?gòu)蔫€匙串導(dǎo)出該證書,拉到項(xiàng)目里直接使用
其本質(zhì)原因是后端的自簽名證書需要進(jìn)行base64反編碼才能使用。
總結(jié)語(yǔ):
通過(guò)對(duì)自簽名證書這塊的研究,對(duì)https有了更加深入、更深刻的認(rèn)識(shí),同時(shí)對(duì)AFNetworking中AFSecurityPolicy的源碼進(jìn)行了閱讀和理解。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS實(shí)現(xiàn)電子簽名
- iOS mobileconfig配置文件進(jìn)行簽名的配置方法
- iOS 超級(jí)簽名之描述文件的實(shí)現(xiàn)過(guò)程
- iOS應(yīng)用腳本重簽名的實(shí)現(xiàn)方法
- iOS APP簽名機(jī)制原理詳解
- 詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
- Android和iOS包批量重簽名
- iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試詳解
- iOS中的ipa重簽名(逆向必備)
- iOS之Https自簽名證書認(rèn)證及數(shù)據(jù)請(qǐng)求的封裝原理
- IOS 簽名錯(cuò)誤codesign failed with exit code 1解決方法
- ios的簽名機(jī)制詳解
相關(guān)文章
iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程
這篇文章主要介紹了iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程,即用UINavigationController來(lái)編寫navigation,示例代碼為Objective-C語(yǔ)言,需要的朋友可以參考下2016-02-02
Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
iOS實(shí)現(xiàn)數(shù)字倍數(shù)動(dòng)畫效果
在iOS開發(fā)中,制作動(dòng)畫效果是最讓開發(fā)者享受的環(huán)節(jié)之一,下面這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)數(shù)字倍數(shù)動(dòng)畫效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
總結(jié)iOS實(shí)現(xiàn)漸變顏色的三種方法
這篇文章主要給大家總結(jié)了iOS實(shí)現(xiàn)漸變顏色的三種方法,分別是利用CAGradientLayer實(shí)現(xiàn)漸變、Core Graphics相關(guān)方法實(shí)現(xiàn)漸變以及用CAShapeLayer作為layer的mask屬性實(shí)現(xiàn),大家可以根據(jù)自己的需要選擇使用,下面來(lái)一起看看吧。2016-10-10
iOS 11 使用兩種方法替換(Method Swizzling)去掉導(dǎo)航欄返回按鈕的文字
這篇文章主要介紹了iOS 11 使用方法替換(Method Swizzling)去掉導(dǎo)航欄返回按鈕的文字,需要的朋友可以參考下2018-05-05
iOS tableview實(shí)現(xiàn)頂部拉伸效果
這篇文章主要為大家詳細(xì)介紹了iOS tableview實(shí)現(xiàn)頂部拉伸效果,以及頭部拉伸效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
IOS 時(shí)間和時(shí)間戳之間轉(zhuǎn)化示例
我們經(jīng)常從服務(wù)器后臺(tái)拿到時(shí)間戳的時(shí)間,以下代碼可以實(shí)現(xiàn)將時(shí)間戳轉(zhuǎn)為可讀的時(shí)間格式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01

