iOS 适配HTTPS方法

一切为了迎合苹果

在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能。App Transport Security(ATS)是苹果在iOS 9中引入的一项隐私保护功能,屏蔽明文HTTP资源加载,连接必须经过更安全的HTTPS。苹果目前允许开发者暂时关闭ATS,可以继续使用HTTP连接,但到年底所有官方商店的应用都必须强制性使用ATS。但如果2017年1月1日起您仍一意孤行那么在Apple Store中您的App将不能被用户下载使用。

兼容HTTP

新特性要求App内访问的网络必须使用HTTPS协议。
但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTPS协议传输,需要兼容下HTTP。
网络请求报错:The resource could not be loaded because the App Transport Security policy require:

所以先兼容下http:

  1. Info.plist中添加NSAppTransportSecurity类型Dictionary
  2. NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES
  3. 为了适配webView中的http链接:在NSAppTransportSecurity下添加Allow Arbitrary Loads in Web Content类型Boolean,值设为YES

适配HTTPS

iOS开发者来说,需要尽早解决HTTPS请求的问题。

发送HTTPS请求信任SSL证书和自签名证书,分为三种情况:

  1. (较少的公司)如果你的app服务端安装的是SLL颁发的CA,可以使用系统方法直接实现信任SSL证书,关于Apple对SSL证书的要求请参考:苹果官方文档CertKeyTrustProgGuide
    示例代码:
NSURL *URL = [NSURL URLWithString:URLString];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];//创建同步连接NSError *error = nil;NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; NSString *receivedInfo = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
  1. (大部分公司)基于AFNetWorking的SSL特定服务器证书信任处理,使用自签名证书认证,重写AFNetWorking的customSecurityPolicy方法。
    ###验证证书步骤:
  2. 从服务器要来.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// 如果是需要验证自建证书,需要设置为YESsecurityPolicy.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。

  • 在发送请求时候 加上这行代码,https ssl 验证。
//    [[AFHTTPSessionManager manager] setSecurityPolicy:[JYAFNetworkingManager customSecurityPolicy]];
  1. 更改系统方法,发送异步NSURLConnection请求。
    这种方式用的很少就不多介绍了有新区可以自行搜索;

大部分可以参考:
http://www.jianshu.com/p/f312a84a944c
http://www.jianshu.com/p/6b9c8bd5005a
http://www.jianshu.com/p/b03ae4a1a2d3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板—tarjan求割边

int dfn[MAXN],low[MAXN],cnt; void tarjan(int x,int edg) {low[x]dfn[x]cnt;for(int if(x);i;in(i))if(!dfn[v(i)]){tarjan(v(i),i);low[x]min(low[x],low[v(i)]);if(low[v(i)]>dfn[x])isbridge[i]isbridge[i^1]1;}else if(i!(edg^1))low[x]min(low[x],dfn(v(i))); } 转载…

GoJs Pictures 官方介绍文档

图片 使用Picture类显示图像。 最常见的用法是使用URL字符串设置Picture.source属性,以及通过GraphObject.desiredSize(图对象的所需尺寸)获取或通过设置GraphObject.width(图对象的宽)和GraphObject.height&#xff0…

怎样购买及安装ssl安全证书

查找资料记录,不是我的项目笔记 现在越来越多的网站都开始用安全链接了,在国外的话,如果不是一个安全链接,用户很大程度上会拒绝使用,所有安全链接是未来的趋势,楼主第一次配安全证书的时候,刚刚…

XmlViewResolver 和 ResourceBundleViewResolver

使用XmlViewResolver 如果视图对象的 Bean 数目太多,那么直接在 smart-servlet.xml 文件中配置,势必影响主配置文件的简洁性。XmlViewResolver 和 BeanNameViewResolver 功能相似,唯一不同的是它可以将视图 Bean 定义在一个独立的 XML 文件中…

(转载)Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!

转载自 Git使用教程 预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)一:Git是什么? Git是目前世界上最先进的分布式版本控制系统。 工作原理 / 流程: Workspace:工作…

soureTree中如何设置git 用户名与密码 SourceTree提交修改用户详细图文方法

mac上软件更新: 现在没有网络小模块了,在同行右边高级里面有默认用户名删除即可!!!! sourceTree 切换Git登录用户,之前在SourceTree提交远程服务用的是同事的账号,同事离职后账号也…

shell 脚本 生成文件,文件名为日期时间

脚本如下 #/bin/bashfilename$(date %Y%m%d)_$(date %H%M%S) touch $filename.txt 其中 $() 表示括号中的 shell 命令的结果,所以 filename 是一个字符串,比如 20190714_111631,即 2019 年 7 月 14 日 11 点 16 分 31 秒。 然后第二行命令&am…

js利用HTML5的拖拽API做流程图

上代码 直接用看效果&#xff0c;学习一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style type"text/css">#d1{width:800px;height:800px;border: 1…

Pots (BFS ➕ 输出路径)

题目链接&#xff1a;http://poj.org/problem?id3414 思路&#xff1a; 因为有六种操作&#xff0c;所以六种操作中合法的都加入队列中BFS 如何去输出路径呢&#xff1f; 我们不妨设一个string数组&#xff0c;它的索引就和我们的步数有关&#xff0c;然后按顺序输出就可以了…

box-sizing的使用

box-sizing 人们慢慢的意识到传统的盒子模型不直接&#xff0c;所以他们新增了一个叫做 box-sizing 的CSS属性。当你设置一个元素为 box-sizing: border-box; 时&#xff0c;此元素的内边距和边框不再会增加它的宽度。这里有一个与前一页相同的例子&#xff0c;唯一的区别是两…

vue-router的hash模式和history模式,

hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件: window.onhashchange function(event){ console.log(event.oldURL, event.newURL); let hash location.hash.slice(1); document.body.style.color hash; } 上面的代码可以通过改变hash来改变页面字体…

更新node最新版本方法和 npm install -g n 运行错误

使用xshell连接linux服务器后&#xff0c;首先输入node -v查看当前使用的版本 如果上面查看的版本比较低&#xff0c;则可以开始升级 清除npm cache 升级之前还需要安装n模块&#xff0c;n模块是专门用来管理nodejs的版本 输入npm install -g n n模块安装完成之后&#x…

vue-router的路由

路由和组件是有区别的&#xff1a;组件一般是在同一个页面的不同模块&#xff0c;但是路由是直接切换到另一个页面&#xff0c;之前的页面销毁。 App.vue中的router-view会渲染顶级路由匹配到的组件。组件内部嵌套的router-view会渲染子路由匹配到的组件。 当路由跳转的时候&am…

mac上的更新node npm

查看当前node版本 $ node -v v8.9.4 清除node.js的cache(不确定有没有必要) $ sudo npm cache clean -f Password: npm WARN using --force I sure hope you know what you are doing. 安装工具n &#xff0c;这个工具是专门用来管理node.js版本的 $ sudo npm install -g …

电源芯片选择DC/DC还是LDO?《转》

这个取决于你的应用场合。比如用在升压场合&#xff0c;当然只能用DC/DC&#xff0c;因为LDO是压降型&#xff0c;不能升压。另外看下各自的主要特点&#xff1a; DC/DC:效率高&#xff0c;噪声大&#xff1b; LDO:噪声低&#xff0c;静态电流小&#xff1b; 所以如果是用在压降…

Atom React或前端插件推荐

分享一些Atom个人在用的插件,喜欢请点赞 1. color-picker 取色工具 2. pigments 编辑器中直接查看代码所代表的颜色&#xff0c;工具虽小但是很实用。 3. minimap 仿sublime text的缩略代码查看&#xff0c;想找的地方一目了然。 4. highlight-selected 选择某段代码自动高…

Nike Kyrie 1 Performance Review

Traction – There has been many varying opinions on the Kyrie 1’s traction, and I don’t think any of them have been wrong. I’d say under the right conditions, the traction is excellent. I’ve experienced nothing but great traction out of them, but all o…

Tapable.plugin is deprecated. Use new API on `.hooks` instead

问题描述 在使用extract-text-webpack-plugin给webpack打包时出现报错 Tapable.plugin is deprecated. Use new API on .hooks instead 1 问题原因 extract-text-webpack-plugin目前版本不支持webpack4。 解决方案 使用extract-text-webpack-plugin的最新的beta版 npm inst…

第二周进度总结

本周主要在完成假期作业&#xff0c;学习的时间大部分花在代码上。完成了3个代码的编译。第一个是害死人不偿命的(3n1)猜想。第二个是成绩排名&#xff08;输出成绩最高和成绩最低学生的姓名和学号&#xff09;。第三个是换个格式来输出任一个不超过 3 位的正整数。这三个题目中…

webpack.optimize.CommonsChunkPulgin is not a constructor???请看CommonsChunkPlugin VS SplitChunksPlugin

webpack团队人员卧薪尝胆五个多月的时间终于带来的webpack4&#xff0c;个人觉得webpack4带来的最大优化便是对于懒加载块拆分的优化&#xff0c;删除了CommonsChunkPlugin&#xff0c;新增了优化后的SplitChunksPlugin&#xff0c;那么CommonsChunkPlugin的痛点在哪&#xff1…