iOS 开发之ATS安全的配置
2016年11月至12月提交的应用到appstore的小伙伴都知道,所有的HTTP请求都必须为HTTPS,尽管后来又说会delay半年实施,但是保险起见,小编我还是已经换成了https,并且做了相应的安全配置;
一.ATS描述
iOS9中新增App Transport Security(ATS)特性,主要使原来请求的时候用到的HTTP都转向TLS1.2协议进行传输。默认情况下非HTTPS的网络访问是被禁止的。通过NSAllowsArbitraryLoads 设置为YES 来禁用ATS。
WWDC16中,Apple表示继续收紧对HTTP的访问限制。2017年1月1日起,所有的新提交app默认是不允许使用NSAllowArbitraryLoads来绕过ATS限制的,换句话说,我们最好保证app的所有网络请求都是HTTPS加密的,否则可能会在应用审核时遇到麻烦。
二、强调iOS Security,改成https请求的原因
1>现在手机已经成为大家接入互联网的主要设备;
2>移动场景下的数据安全问题更加复杂,Wi-Fi定向攻击随时随地都有可能发生;
3>Wi-Fi、短信、电话、密码、手机卡这些已经越发的公开和透明化;
4>伴随着互联网金融的爆发,P2P理财、余额宝、银行客户端等越来越不安全;
三、苹果公司针对这些隐患所做的安全措施
1>手机硬件芯片级的安全(苹果把安全做到芯片上);一方面,public key由苹果公司提供,且不可伪造;另一方面,设备的每次软件升级都需要苹果的认证;
2>Data protection
password:password作为种子,加上硬件信息共同生成的加密密钥;
sandbox:沙河将数据隔离,所有用户的权限获得,都需要用户同意;
code signing:代码都是需要签名的,整个系统以及所有应用,都在code siging的检查下运行的;
touch ID:指纹采集器sensor由独立的通道传递信息到secwe endave
3>用户软件升级上的安全(iOS10.x,iOS9.x,iOS8.x)
4>开发者层面上的安全:(1)Touch ID 可被开发者使用;(2)App-Transport Security (3)使用TLS1.2以上的安全协议;(4)HTTP+Security,变为安全传输通道;
四、iOS10 NSAppTransportSecurity
1>Server端 :购买SSL证书,配置Nginx;
2>iOS客户端的配置如下:
对NSAppTransportSecurity的支持自iOS9.0,OS X v10.11开始,适用于App和App extension。
对于使用iOS9.0,OS X v10.11SDK及以上的App来说,ATS默认开启。在启用ATS的情况下,所有的HTTP请求必须为HTTPS(RFC2808)链接。任何不安全的HTTP请求都将失败。ATS使用TLSv1.2(RFC5246)以上,才可通讯。
在项目的info.plist中配置这个键,开发者可以自定义网络安全策略。自iOS10,macOS 10.12开始,新增了下列子健的支持:
NSAllowsArbitraryLoadsInMedia
NSAllowsArbitraryLoadsInWebContent
NSRequiresCertificateTransparency
NSAllowsLocalNetworking
ATS的总体结构,都是非必填
NSAppTransportSecurity : Dictionary {
NSAllowsArbitraryLoads : Boolean
NSAllowsArbitraryLoadsInMedia : Boolean
NSAllowsArbitraryLoadsInWebContent : Boolean
NSAllowsLocalNetworking : Boolean
NSExceptionDomains : Dictionary {
: Dictionary {
NSIncludesSubdomains : Boolean
NSExceptionAllowsInsecureHTTPLoads : Boolean
NSExceptionMinimumTLSVersion : String
NSExceptionRequiresForwardSecrecy : Boolean // Default value is YES
NSRequiresCertificateTransparency : Boolean
}
}
}
以上主键用来定义app的总体ATS策略;
子健 NSExceptionDomains下面的键,使用这些键针对某个域名单独配置。
主键:NSAllowsArbitraryLoads 设置为YES,禁用ATS限制注意:设置为YES会引发App Stroe的审查,开发者必须说明原因。不能说服审核人员,将被拒。
主键:NSAllowsArbitraryLoadsInMedia 设置为YES,解除通过AVFoundation框架访问媒体内容时的ATS限制;启用这个键,务必确保载入的媒体内容已经被加密,例如受FairPlay保护的文件,或者是安全的HLS流媒,其中不包含敏感的个人信息。
主键:NSAllowsArbitraryLoadsInWebContent 设置为YES 解除通过webview发出的网络请求的ATS限制。启用这个键,可以使app访问任意的网页内容,但不影响app的总体ATS策略。
主键:NSAllowsLocalNetworking 设置为YES 使得app可以载入任意本地资源,但不影响app的总体ATS策略。
主键:NSExceptionDomains 为一个或多个域名单独配置ATS。
被单独配置的域名,默认受到完全的ATS限制,不管NSAllowsArbitraryLoads的值如何:需要通过子健,进一步配置,所有子健都属于NSExceptionDomains。
子键1:NSIncludesSubdomains 设置为YES,当前域名的ATS策略使用于所有子域名。默认NO。
子键2:NSExceptionAllowsInsecureHTTPLoads 设置为YES,可以同时通过HTTP和HTTPS访问当前域名。默认NO。注意配置这个键值将引发AppStore的审查,开发者必须说明原因。
子键3:NSExceptionMinimumTLSVersion 指定TLS的最低版本,可以使用版本较低的,有安全漏洞的TLS协议。注意,配置这个键值,将引发AppStore的审查,开发者必须说明原因。
子键4:NSExceptionRequiresForwardSecrecy设置为NO,允许对当前域名使用不支持正向保密的TLS加密算法。默认YES。
子键5:NSRequiresCertificateTransparency设置为YES,将验证域名服务器证书的Certificate Transparency时间戳。默认NO。