iOS 对App内部的http请求进行白名单设置 您所在的位置:网站首页 苹果的白名单怎么设置不了 iOS 对App内部的http请求进行白名单设置

iOS 对App内部的http请求进行白名单设置

2024-07-02 04:36| 来源: 网络整理| 查看: 265

原定于2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS,需要配置Https。但是现在不需要了,无固定期限的往后延期了,但是这个还是得弄明白下为好,说不定哪天突然就让弄了。 一、 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS。 就是要求去掉 Info.plist 的 NSAllowsArbitraryLoads 1.这要求所有通过APP发送的网络请求都需要https

2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;

3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES , 可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。 这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用.

4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码

NSAppTransportSecurity NSExceptionDomains XXX.com NSIncludesSubdomains NSExceptionRequiresForwardSecrecy NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion TLSv1.1

二、 目前项目中用到的第三方已经支持https的有

WKWebView UIWebView SDWebImage 支付宝SDK 微信支付SDK 友盟SDK 极光推送SDK 其中用到的UIWebView 以后要逐步替换为WKWebView

上面内容参考于:http://blog.csdn.net/zhangmengleiblog/article/details/53536956

三、下面是在AFN中配置实例: + (AFSecurityPolicy*)customSecurityPolicy { // /先导入证书 NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" ofType:@"cer"];//证书的路径 NSData *certData = [NSData dataWithContentsOfFile:cerPath];

// 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; }

将上面的方法添加到我们AFN请求数据中 + (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure { // 1.获得请求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 2.申明返回的结果是text/html类型 mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

// 加上这行代码,https ssl 验证。 //[mgr setSecurityPolicy:[self customSecurityPolicy]]; // 3.发送POST请求 [mgr POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObj) { if (success) { success(responseObj); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure(error); } }]; }

上面参考于 http://blog.csdn.net/canlanyangg/article/details/53559597 这篇文章。 四.关于证书 参考文章:http://www.2cto.com/Article/201510/444706.html 服务端给的是crt后缀的证书,其中iOS客户端用到的cer证书,是需要开发人员转换: 1.证书转换 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句

openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der

这样你就可以得到cer类型的证书了。双击,导入电脑。 2.证书放入工程 1、可以直接把转换好的cer文件拖动到工程中。 2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

参考链接:http://www.jianshu.com/p/97745be81d64。

五.在info.plist去掉之前允许http加载的代码 就是删除下面的代码(么有的就省了这一步)

NSAppTransportSecurity NSAllowsArbitraryLoads

六、可能出现的问题: 6.1服务器可能出现的问题:

Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo= {NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey={type = immutable, count = 1, values = ( 0 : )}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates={type = immutable, count = 1, values = ( 0 : )}}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0}

可能是服务器配置的证书不对,苹果要求是TLS1.2,服务端配置是TLS1.0。 也有可能是后台签名算法问题 https://my.oschina.net/vimfung/blog/494687 6.2、证书一定要拉到项目里面,AFN加了验证之后,看看获取证书的certData是否为空。如果为空,则证书有问题 NSData *certData = [NSData dataWithContentsOfFile:cerPath];



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有