当前位置: 首页 > 科技观察

苹果新“AppTransportSecurity”的理解和使用

时间:2023-03-18 11:29:03 科技观察

本文是对WWDC大会上提出的AppTransportSecurity(应用传输安全)模型的解读,苹果在AppTransportSecurityTechnote中也进行了解读。随着iOS9和OSXElCapitan的发布,Apple正式引入了AppCommunicationSecurityMode的概念。简而言之,应用程序通信安全模型要求应用程序使用最新的安全通信协议,例如TLS1.2版和前向保密。在不久的将来,Apple还将更新这些最佳实践,以确保他们在保护在线数据方面保持领先地位。在iOS9和OSXEICaption之后,使用NSURLSession时默认启用ATS。不幸的是,对于大多数开发人员来说,这意味着当他们在新版本的操作系统上构建时,事情会发生很大变化。好消息是苹果官方提供了一些可选的配置项来决定是否开启ATS模式,也就是你可以选择开启或者不开启。开发者不能对某些URL使用ATS,需要在项目的info.plist中标记NSExceptionDomains。IntheNSExceptionDomainsdictionary,youcanexplicitlyspecifysomeURLsthatdonotuseATS.这些你可以使用的例子可以是:-NSIncludesSubdomains-NSExceptionAllowInsecureHTTPLoads-NSExceptionRequiresForwardSecrecy-NSExceptionMinimumTLSVersion-NSThirdPartyExceptionAllowsInsecureHTTPLoads-NSThirdPartyExceptionMinimumTLSVersion-NSThirdPartyExceptionRequiresForwardSecrecy这些关键字使我们可以更加细致的设置针对不使用ATS的地域情况下禁止使用ATS或一些特殊的ATS选项。**在iOS9的beta1版本中,上述的关键字是错误的,应该使用如下关键字:**-NSTemporaryExceptionAllowsInsecureHTTPLoads-NSTemporaryExceptionRequiresForwardSecrecy-NSTemporaryExceptionMinimumTLSVersion-NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads-NSTemporaryThirdPartyExceptionMinimumTLSVersion-NSTemporaryThirdPartyExceptionRequiresForwardSecrecy这些关键字在不久以后肯定会被替换掉。Ifyoucan,youshouldusethe***groupofkeywords,becauseAppleofficiallysupportsthesekeywords.Althoughyouareusingatemporarykeyword,itshouldcontinuetoworkinfuturebetareleases.Belowaresomesituationsthatdevelopersmayencounterduringdevelopment.Example1ATSisusedinallcasesThisisthesimplestcase.TheonlythingyouneedtodoisuseNSURLSession.IfyourdevelopmenttargetisafteriOS9orOSXElCapitan,thebestpracticeofATSwillbeappliedtoallNSURLSession-basednetworks.Example2UseATSexceptinspecialcasesIfyouwantallyourdomainnamestouseATSforallcommunicationsexceptforsomethatareknownnottouseATS.Inthiscaseyoucanspecifysomespecialcasesthatdon'tuseATS,anduseATSfortherest.Forthisscenario,*NSExceptionDomains*canbeusedtoidentifydomainsusingtheATSdefaultsettings.Tofilteroutalldomainsorsubdomains,createadictionarycontainingtheURLsyouwanttoexcludefromusingATS,andset*NSExceptionAllowInsecureHTTPLoads*inittotrue.IfyouwanttocompletelydisableATSforthesedomains,youcanalsospecifymorerulestorestrict,suchasusingthe*NSExceptionRequiresForwardSecrecy*and*NSExceptionMinimumTLSVersion*keywords.Example3Exceptinspecialcases,donotuseATS.Intheoppositecasetotheaboveexample,youmaywishtouseATSindomainsthatyouknowaresupported.比如你开发一个推特客户端,你可能需要加载无数个可能不支持ATS的URL,但是又希望网络条件与其他请求一致才能向推特服务器发起登录请求。在这种情况下,您可以将禁用ATS设置为默认选项,然后指定需要使用ATS的URL。在这种情况下,您需要将*NSAllowArbitraryLoads*设置为true,然后在*NSExceptionDomains*字典中定义需要保护的URL。每个需要保护的域都需要有自己的字典,字典中的*NSExceptionAllowInsecureHTTPLoads*选项需要设置为false。Example4Low-levelATS在某些情况下,可能在所有情况下都使用ATS,或者某些情况下,或者自己的URL,但并不是所有的都支持所有的ATS***实践。可能你的应用服务器只支持TLS1.2,不支持以后的版本。与其将所有涉及的域都设置为不使用ATS,不如将它们设置为支持较低版本的ATS。在这种情况下,您需要创建一个*NSExceptionDomains*字典,这是一个要为每个域重复使用的字典选项,然后将*NSExceptionRequiresForwardSecrecy*值设置为false。同样,如果你想要前向支持,但需要最新版本的TLS,你可以使用*NSExceptionMinimumTLSVersion*关键字定义你的应用程序服务器支持的TLS版本。示例5NSA-friendly模式如果你想完全不使用ATS(不推荐这种模式,你需要充分了解它的隐患。)你可以在info.plist中设置*NSAllowArbitraryLoads*属性为true。Third-partykeys你可能会注意到,有些关键字似乎使用了其他关键字中的一些词,但在前面添加了“ThirdParty”一词:-NSThirdPartyExceptionAllowsInsecureHTTPLoads-NSTirdPartyExceptionMinimumTLSVersion-NSThirdPartyExceptionRequiresForwardSecrecy从功能上讲,这些关键字与“ThirdParty”关键字无关,具有相同的效果.而实际运行中调用的代码会完全忽略是否使用“ThirdParty”关键字。您应该使用适用于您的场景的关键字,而无需过多考虑它们。CertificateTransparency虽然默认情况下ATS的大多数安全功能都可用,但必须设置CertificateTransparency。如果您有支持证书透明度的证书,则可以检查NSRequiresCertificateTransparency关键字以使用证书透明度。同样,如果您的证书不支持CertificateTransparency,则此项需要设置为不可用。如果需要调试一些使用ATS引起的问题,需要将CFNETWORK_DIAGNOSTICS设置为1,会打印NSURLSession的错误信息,包括访问的URL和ATS错误。确保处理所有遇到的错误消息,以便ATS易于提高可靠性和可扩展性。以上所有信息都反映在WWDC2015NSURLSession会话中。***,Apple强调需要报告开发过程中的所有问题,需要密切关注未来测试版中可能发生的变化。