最新 配置Https 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS

本文主要是介绍最新 配置Https 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 一.项目中的网络交互都是基于AFN,要求AFN版本在3.0及其以上;  
  2.   
  3. 二.代码部分  
  4. 设置AFN请求管理者的时候 添加 https ssl 验证。  
  5. // 1.获得请求管理者  
  6. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  7. // 2.加上这个函数,https ssl 验证。  
  8. [manager setSecurityPolicy:[self customSecurityPolicy]];  
  9.   
  10. // https ssl 验证函数  
  11.   
  12. - (AFSecurityPolicy *)customSecurityPolicy {  
  13.       
  14.     // 先导入证书 证书由服务端生成,具体由服务端人员操作  
  15.     NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径  
  16.     NSData *cerData = [NSData dataWithContentsOfFile:cerPath];  
  17.       
  18.     // AFSSLPinningModeCertificate 使用证书验证模式  
  19.     AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  
  20.          // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
  21.     // 如果是需要验证自建证书,需要设置为YES  
  22.     securityPolicy.allowInvalidCertificates = YES;  
  23.       
  24.     //validatesDomainName 是否需要验证域名,默认为YES;  
  25.     //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
  26.     //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
  27.     //如置为NO,建议自己添加对应域名的校验逻辑。  
  28.     securityPolicy.validatesDomainName = NO;  
  29.       
  30.     securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil nil];  
  31.       
  32.     return securityPolicy;  
  33. }  
  34.   
  35.   
  36. 三.关于证书 参考文章:http://www.2cto.com/Article/201510/444706.html  
  37. 服务端给的是crt后缀的证书,其中iOS客户端用到的cer证书,是需要开发人员转换:  
  38. 1.证书转换  
  39. 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句  
  40.   
  41. openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der  
  42.   
  43. 这样你就可以得到cer类型的证书了。双击,导入电脑。  
  44. 2.证书放入工程  
  45. 1、可以直接把转换好的cer文件拖动到工程中。  
  46. 2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了  
  47. 或者直接在你网站上下载 例如:kyfw.12306.cn:443的:
  48.   openssl s_client -connect kyfw.12306.cn:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer
  49. 参考链接:http://www.jianshu.com/p/97745be81d64。  
  50.    
  51. 四.在info.plist去掉之前允许http加载的代码 就是删除下面的代码(么有的就省了这一步)  
  52.  <key>NSAppTransportSecurity</key>  
  53.     <dict>  
  54.  <key>NSAllowsArbitraryLoads</key>  
  55.  <true/>  
  56.     </dict>  


[objc]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. 一、  
  2.  201711日起所有提交到 App Store 的App必须强制开启 ATS。  
  3.  就是要求去掉 Info.plist 的 NSAllowsArbitraryLoads  
  4.  1.这要求所有通过APP发送的网络请求都需要https  
  5.    
  6.  2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;  
  7.    
  8.  3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES ,  
  9.  可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。  
  10.  这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用.  
  11.    
  12.  4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码  
  13.      <key>NSAppTransportSecurity</key>  
  14.      <dict>  
  15.          <key>NSExceptionDomains</key>  
  16.          <dict>  
  17.              <key>XXX.com</key>  
  18.              <dict>  
  19.                  <!--适用于这个特定域名下的所有子域-->  
  20.                  <key>NSIncludesSubdomains</key>  
  21.                  <true/>  
  22.                  <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码-->  
  23.                  <key>NSExceptionRequiresForwardSecrecy</key>  
  24.                  <false/>  
  25.                  <!--允许App进行不安全的HTTP请求-->  
  26.                  <key>NSExceptionAllowsInsecureHTTPLoads</key>  
  27.                  <true/>  
  28.                  <!--在这里声明所支持的 TLS 最低版本-->  
  29.                  <key>NSExceptionMinimumTLSVersion</key>  
  30.                  <string>TLSv1.1</string>  
  31.              </dict>  
  32.          </dict>  
  33.      </dict>  
  34.    
  35.  二、  
  36.  目前项目中用到的第三方已经支持https的有  
  37.  WKWebView  
  38.  UIWebView  
  39.  SDWebImage  
  40.  支付宝SDK  
  41.  微信支付SDK  
  42.  友盟SDK  
  43.  极光推送SDK  
  44.    
  45.  其中用到的UIWebView 以后要逐步替换为WKWebView  

如果报错
Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}}}, 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



iOS适配https参考链接: https://github.com/ChenYilong/iOS9AdaptationTips

证书生成的参考链接:http://www.2cto.com/Article/201510/444706.html

证书转换的参考链接:http://www.jianshu.com/p/97745be81d64

这篇关于最新 配置Https 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373302

相关文章

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行