In order to validate a domain name for self signed certificates, you MUST use pinning
上述問題的解決方法:數組
securityPoliy.allowInvalidCertificates = YES;//若是是須要驗證自建證書,須要設置爲YES securityPoliy.validatesDomainName = NO;//不驗證證書的域名
.crt
格式的證書,而後用Mac鑰匙串打開,而後導出 .cer
格式的證書.cer
證書導入程序的 中。/** https證書驗證 */ +(AFSecurityPolicy*)customSecurityPolicy { // /先導入證書 NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//證書的路徑 NSData *certData = [NSData dataWithContentsOfFile:cerPath]; // AFSSLPinningModeCertificate 使用證書驗證模式 (AFSSLPinningModeCertificate是證書全部字段都同樣才經過認證,AFSSLPinningModePublicKey只認證公鑰那一段,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 = NO; securityPolicy.pinnedCertificates = (NSSet *)@[certData]; return securityPolicy; }
其中的cerPath
就是app bundle
中證書路徑,certificate
爲證書名稱的宏,僅支持cer
格式,securityPolicy
的相關配置尤其重要,請仔細閱讀customSecurityPolicy
方法並根據實際狀況設置其屬性。安全
這樣,就可以在AFNetWorking的基礎上使用HTTPS協議訪問特定服務器,可是不能信任根證書的CA文件,所以這種方式存在風險,讀取pinnedCertificates中的證書數組的時候有可能失敗,若是證書不符合,certData就會爲nil。服務器
// [[AFHTTPSessionManager manager] setSecurityPolicy:[JYAFNetworkingManager customSecurityPolicy]];