? ? ? ? 從6月的WWDC起就流傳著2017年1月1日蘋果要強(qiáng)制HTTPS的消息,當(dāng)時(shí)忙于開發(fā)哪管的了這么多球恤,現(xiàn)在臨近年末,移動(dòng)端和服務(wù)端配置HTTPS的需求也提上了日程。
? ? ? ? 如果服務(wù)器已經(jīng)配好了CA證書皂岔,不管是NSURL還是AFNetWorking,直接修改Define里的HTTP為HTTPS就行展姐。而因?yàn)楦鞣N原因躁垛,只能用服務(wù)端自簽名證書的,其實(shí)也不難圾笨。當(dāng)然如果服務(wù)端不了解蘋果機(jī)制教馆,安卓端也沒這類需求,那就只能百度了(雖說在IT行業(yè)里谷歌擂达、StackOverFlow才是政治正確...)
? ? ? ? 隨手百度一下關(guān)鍵詞土铺,iOS、HTTPS、AF 悲敷、證書究恤,要么是做廣告的,要么是幾年前的老帖子后德,不過經(jīng)過我整整一天的挨個(gè)測(cè)試丁溅,總算找到一個(gè)完美解決AFNetWorking3.0下,通過自簽名證書與單向認(rèn)證的服務(wù)端進(jìn)行HTTPS請(qǐng)求的辦法探遵。
? ? ? ?就在昨天窟赏,onevcat大神更新了iOS10下蘋果最新的HTTPS的需求,關(guān)于 iOS 10 中 ATS 的問題?箱季,同時(shí)也解決了我的一個(gè)疑問涯穷,那就是明年初,蘋果可能通過嚴(yán)格限制ATS的開關(guān)來強(qiáng)制HTTPS藏雏,而不是通過簡(jiǎn)單的校驗(yàn)HTTP前綴拷况。也就是說一些取巧的辦法,在沒有自簽名證書的情況下掘殴,一旦關(guān)閉ATS赚瘦,就只能GG了。
? ? ? ?廢話不多說奏寨,完美解決方案來自于 @天空中的球 前輩起意,相關(guān)帖子是iOS 中 AFNetworking HTTPS 的使用
簡(jiǎn)單總結(jié)就是咱們自力更生,不用向服務(wù)端要什么證書(因?yàn)樗麄兇虬鰜淼牟灰欢ㄊ嵌M(jìn)制文件)病瞳,通過終端(只用把www.google.com改成接口前綴就行揽咕,記著先cd到Desktop)
openssl s_client -connect www.google.com:443 /dev/null | openssl x509 -outform DER > https.cer
直接獲取Cer,然后拖進(jìn)程序套菜,添加以下代碼亲善。
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無(wú)效證書(也就是自建的證書),默認(rèn)為NO
//如果是需要驗(yàn)證自建證書逗柴,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
securityPolicy.pinnedCertificates = set;
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer=[AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
[manager setSecurityPolicy:securityPolicy];
然后去Plist里關(guān)閉ATS蛹头,在Define里把HTTP改為HTTPS,接著運(yùn)行程序戏溺,接口沒問題就大功告成了(當(dāng)然前提是服務(wù)端支持HTTPS)
另外在測(cè)試過程中遇到瘋狂崩潰的問題渣蜗,雖然提示是
[__NSArrayM insertObject:atIndex:]: object cannot be nil
其實(shí)跟數(shù)組越界半毛錢關(guān)系沒有,就是證書的問題于购,直接從終端自己生成就行袍睡。
如果服務(wù)端開了雙向認(rèn)證知染,那么可以看看這位大神的帖子?AFNetworking 3.0與服務(wù)端 自簽名證書 https雙向認(rèn)證
在簡(jiǎn)書的第一帖肋僧,如果還有問題歡迎留言討論,非常感謝~
參考
AFNetworking 3.0與服務(wù)端 自簽名證書 https雙向認(rèn)證
iOS 適配https(AFNetworking3.0為例)
iOS9 使用自簽證證書實(shí)現(xiàn)HTTPS