在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能。也就是说,自2017年起,网络请求必须由http改成https。
相关配置方案:
1.后台配置一个CA证书,包含域名信息等,保存后给前端使用,前端把cer文件拖入工程中。(必须保证前后端使用的证书一致)
2.info.plist 文件中原本设置NSAllowsArbitraryLoads 设置为NO,NSAllowsArbitraryLoads若设置为YES,则表示禁用ATS功能,NO为开启 ATS功能,默认为NO
3.苹果硬性要求服务端的TLS版本必须>= 1.2
4.服务端配置OK后,前端把cer文件拖入工程中,copy ,然后进行代码设置
iOSAFNetWorking加载证书的相关代码:
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@”server” ofType:@”cer”];
NSData * certData =[NSData dataWithContentsOfFile:cerPath];
NSSet * certSet = [[NSSet alloc] initWithObjects:certData, nil];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 是否允许,NO– 不允许无效的证书(如果是自建证书相当于无效证书,此处若是自建证书,必须设置为YES)
[securityPolicy setAllowInvalidCertificates:YES];
// 设置证书
[securityPolicy setPinnedCertificates:certSet];
manager.securityPolicy = securityPolicy;
接下来继续执行正常AF请求。
我们曾遇到的问题:
1.网络请求直接失败,错误信息如下:
Error Domain=NSURLErrorDomain Code=-1200 “发生了 SSL 错误,无法建立与该服务器的安全连接。” UserInfo={_kCFStreamErrorCodeKey=-9847, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, NSUnderlyingError=0x7fbc09cd58c0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 “(null)” UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9847, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9847}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.100.22:8011/interfaces/index.ashx?action=get_date_now, NSErrorFailingURLStringKey=https://192.168.100.22:8011/interfaces/index.ashx?action=get_date_now, _kCFStreamErrorDomainKey=3}
1.检查发现是服务端的TLS版本是1.1,没满足1.2版本配置
2.解决方式:后台升级TLS版本
3,运行程序,依然网络请求失败,但不是这个错误了,发现证书错误,制作证书的时候没加入域名地址。解决后网络正