是否可以以编程方式修改ATS设置

时间:2016-07-08 16:20:24

标签: ios objective-c app-transport-security

我有一个应用程序,用户可以输入不同的网址与不同的服务器进行通信。

苹果App Transport Security在允许用户输入网址方面有点噩梦。

我现在知道的选择:

  1. 关闭ATS。不喜欢这样,因为所有流量都没有受到保护。
  2. 启用ATS,当用户输入不符合ATS的URL时,它将失败。如果他们想要访问不提供ssl或使用弱SHA的服务器,这是最安全但非常有限的。
  3. 让我的用户输入网址然后确定ATS是否失败会很好。如果失败,最好提示用户让他们知道服务器是不安全的,然后如果他们确认则以编程方式添加例外。

    所以问题是,我可以通过编程方式更改ATS设置并为ATS添加例外吗?

2 个答案:

答案 0 :(得分:1)

在这种情况下,我认为你错误地解释了ATS的目的,但是有一些规定可以做你想做的事情。 ATS并非旨在有条件地验证,而是在所有(或至少指定的子集)网络连接上实施特定于操作系统的一组最佳实践。对于大多数简单的应用程序,这足以访问有限数量的高度可见的站点或它们控制的站点。在您的情况下,您需要一个验证功能,可能会提示用户是否可以连接到不安全的站点,或者可能使用内部或托管的白名单来处理配置不当的站点。

我有一个应用程序,它还允许连接到任意服务器,尤其是可能由不同组织设置的服务器,因此可能具有非常不同的升级周期和安全性视图。对于这种设置,白名单风格(Apple的默认设置)并不合适,因为我们需要灵活地支持安全性较差的网站(或者至少是自签名证书,直到人们使用Let&# 39; s加密更多)。

出于我们的目的,我们对ATS使用黑名单风格。基本上我们知道我们控制的站点和知名站点将处于更高的安全级别,因此我们强制ATS在这些站点上强制执行。对于所有其他站点,禁用ATS,允许使用非SSL和配置不当的SSL。

为了执行您自己的检查,您需要实施NSURLSessionDelegate并使用URLSession:didReceiveChallenge:completionHandler:自行决定SSL / TLS连接的有效性。

在处理程序内部,您基本上可以执行任何您认为合适的验证,并且由于它具有completionHandler块,您甚至可以在继续之前提示用户。

我们使用此方法允许用户在显示证书详细信息后进行选择,并将其用于证书固定形式。在钉扎的情况下,我们基本上保存了站点证书的指纹,并使用它来确定用户是否确定该站点(比使用站点的名称更安全,因为用户验证了权限或证书,而不仅仅是URL)。

为了完整起见,当我提到"黑名单式"以上,我特别指的是使用NSAllowsArbitraryLoadsYES,并使用NSExceptionDomains专门列出您知道应该是安全的域名(例如您自己的服务器,或众所周知的域名)服务)。这涉及为异常表中的条目设置NSExceptionAllowsInsecureHTTPLoadsNO

答案 1 :(得分:0)

不幸的是,iOS目前无法做到这一点。更重要的是,在今年的WWDC上,Apple宣布App Store中的所有应用程序必须在今年年底之前启用ATS。在会话中,它确实声明将根据具体情况允许例外,但您需要有正当理由。我不确定你的是否是有效理由(用户输入的服务器名称),只有Apple才能确定。

对您问题中的陈述进行一次更正:

  

关闭ATS。不喜欢这样,因为所有流量都没有受到保护。

选项1不会使所有流量不受保护。禁用ATS仅意味着Apple无法保证应用的流量受到保护。如果您使用具有适当强密钥和前向保密的SSL连接到服务器, 连接将是安全的。但它也允许您通过HTTP连接到不同的服务器,提供的保护形式很少。因此,选项1不会剥离任何安全性,它只是意味着您的用户无法预期所有与服务器相关的流量都是安全的。

用户输入的URL是否提供了可用于在Info.plist中的ATS中放入基于域名的例外的任何模式?