AFN如何验证SSL呢?
第一web端服务器必须要提供一个叫SSL的证书,证书里面包含有一个叫.crt的文件,你需要将它转换成.cer的格式,转换方法如下:
openssl x509 -in your certificate.crt -out your certificate.cer -outform der
转换成功后需要找到你转换成.cer的文件.添加到你的xcode工程当中去;
我用的是AFN2.x 需要添加AFSecuriPolicy和setAFHTTPRequestOperationManager, 如下
- (AFSecurityPolicy*)SecurityPolicy
{
NSString *cerPath = [[NSBundlemainBundle] pathForResource:@"your certificate"ofType:@"cer"];
NSData *certData = [NSDatadataWithContentsOfFile:cerPath];
AFSecurityPolicy *securityPolicy = [[AFSecurityPolicyalloc] init];
[securityPolicy setAllowInvalidCertificates:YES];
[securityPolicy setPinnedCertificates:@[certData]];
[securityPolicy setSSLPinningMode:AFSSLPinningModePublicKey];
return securityPolicy;
}
管理器设置
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
[manager setSecurityPolicy:[selfSecurityPolicy]];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager GET:@"your Url" parameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"成功了");
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
}
这样就可以了,你run一下 会打印出来的信息如下:
这说明请求还是失败的,那具体改如何解决呢? 需要你将下面的代码添加上就OK了!
securityPolicy.allowInvalidCertificates =NO;
securityPolicy.validatesDomainName =YES;
securityPolicy.validatesCertificateChain =NO;
allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO;
如果是需要验证自建证书,需要设置为YES
validatesDomainName 是否需要验证域名,默认为YES;
假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立
validatesCertificateChain 是否验证整个证书链,默认为YES, 设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,达到验证的效果,(对于这具体不明白的可以百度)!
好了 现在你run一下就没问题了, 一切就OK 了!
如有说的不对的地方请指出(见谅)!