为了安全方面的考虑,项目想改用HTTPS进行数据传输.目前项目所用的网络请求是AFN2.6版本的,默认不支持HTTPS网址进行数据请求,错误代码:
2016-01-20 08:49:00.780 TestHttps[1494:30088] CFNetwork SSLHandshake failed (-9824)
2016-01-20 08:49:00.781 TestHttps[1494:30088] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
2016-01-20 08:49:00.782 TestHttps[1494:29950] error==Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7ff7f2c3d260 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://example.com/, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamPropertySSLClientCertificateState=0, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., _kCFStreamErrorDomainKey=3, NSErrorFailingURLKey=https://example.com/, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://example.com/, NSErrorFailingURLStringKey=https://example.com/, _kCFStreamErrorDomainKey=3}
根据网上资料进行修改:
在Info.plist添加字段App Transport Security Settings,设置为YES
一:第一种方法是在网络请求类中添加
AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
policy.allowInvalidCertificates = YES;
policy.validatesDomainName = NO;
manager.securityPolicy = policy;
二:第二种方法是
(1)下载网站的证书导入工程
(2)新建类方法
//自定义安全策略
+ (AFSecurityPolicy*)customSecurityPolicy
{
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"cer"];//证书的路径
// NSString * cerPath = [[NSBundle mainBundle]pathForResource:@"https" ofType:@"cer"];
// NSLog(@"%@",cerPath);
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// NSLog(@"%@",certData);
// NSSet * certSet = [[NSSet alloc] initWithObjects:certData, nil];
// 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 = @[certData];
return securityPolicy;
}
(3)修改AFN源码,如图
这样就可以用https网址进行数据请求了.
后记:HTTPS协议还有SSL还很不清楚,计算机基础差,以后急需补充.
参考资料:
http://www.jianshu.com/p/20d5fb4cd76d
http://oncenote.com/2014/10/21/Security-1-HTTPS/