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]];