? ? ? ? 從6月的WWDC起就流傳著2017年1月1日蘋果要強制HTTPS的消息,當時忙于開發哪管的了這么多,現在臨近年末,移動端和服務端配置HTTPS的需求也提上了日程。
? ? ? ? 如果服務器已經配好了CA證書,不管是NSURL還是AFNetWorking,直接修改Define里的HTTP為HTTPS就行。而因為各種原因,只能用服務端自簽名證書的,其實也不難。當然如果服務端不了解蘋果機制,安卓端也沒這類需求,那就只能百度了(雖說在IT行業里谷歌、StackOverFlow才是政治正確...)
? ? ? ? 隨手百度一下關鍵詞,iOS、HTTPS、AF 、證書,要么是做廣告的,要么是幾年前的老帖子,不過經過我整整一天的挨個測試,總算找到一個完美解決AFNetWorking3.0下,通過自簽名證書與單向認證的服務端進行HTTPS請求的辦法。
? ? ? ?就在昨天,onevcat大神更新了iOS10下蘋果最新的HTTPS的需求,關于 iOS 10 中 ATS 的問題?,同時也解決了我的一個疑問,那就是明年初,蘋果可能通過嚴格限制ATS的開關來強制HTTPS,而不是通過簡單的校驗HTTP前綴。也就是說一些取巧的辦法,在沒有自簽名證書的情況下,一旦關閉ATS,就只能GG了。
? ? ? ?廢話不多說,完美解決方案來自于 @天空中的球 前輩,相關帖子是iOS 中 AFNetworking HTTPS 的使用
簡單總結就是咱們自力更生,不用向服務端要什么證書(因為他們打包出來的不一定是二進制文件),通過終端(只用把www.google.com改成接口前綴就行,記著先cd到Desktop)
openssl s_client -connect www.google.com:443 /dev/null | openssl x509 -outform DER > https.cer
直接獲取Cer,然后拖進程序,添加以下代碼。
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
//如果是需要驗證自建證書,需要設置為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里關閉ATS,在Define里把HTTP改為HTTPS,接著運行程序,接口沒問題就大功告成了(當然前提是服務端支持HTTPS)
另外在測試過程中遇到瘋狂崩潰的問題,雖然提示是
[__NSArrayM insertObject:atIndex:]: object cannot be nil
其實跟數組越界半毛錢關系沒有,就是證書的問題,直接從終端自己生成就行。
如果服務端開了雙向認證,那么可以看看這位大神的帖子?AFNetworking 3.0與服務端 自簽名證書 https雙向認證
在簡書的第一帖,如果還有問題歡迎留言討論,非常感謝~
參考
AFNetworking 3.0與服務端 自簽名證書 https雙向認證