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

标签 ios objective-c app-transport-security

我有一个应用程序,用户可以在其中输入不同的 url 以与不同的服务器通信。

Apple App Transport Security 在允许用户输入 URL 方面有点像噩梦。

我现在知道的选择:

  1. 关闭 ATS。不喜欢这样,因为所有流量都没有受到保护。
  2. 启用 ATS,当用户输入不符合 ATS 的 URL 时,它将失败。如果他们想访问不提供 ssl 或使用弱 SHA 的服务器,这是最安全但非常有限的。

最好让我的用户输入一个 url,然后确定 ATS 是否失败。如果失败,最好提示用户让他们知道服务器不安全,然后在他们确认后以编程方式添加异常。

所以问题是,我能否以编程方式更改 ATS 设置并向 ATS 添加异常(exception)?

最佳答案

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

我有一个应用程序,还允许连接到任意服务器,特别是那些可能由不同组织设置的服务器,因此可能对升级周期和安全性有非常不同的看法。对于这种设置,白名单样式(Apple 的默认设置)并不真正合适,因为我们需要灵 active 来支持安全性较差的网站(或者至少是自签名证书,直到人们更多地使用 Let's Encrypt)。

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

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

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

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

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

关于ios - 是否可以以编程方式修改 ATS 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271364/

相关文章:

iPhone 应用程序上传问题

ios - 在 Info.plist 中,我已经添加了 NSSpeechRecognitionUsageDescription 和字符串。但仍然显示相同的错误

ios - 获取 '-[__NSArrayM city]: unrecognized selector sent to instance 0x111c03460' 错误

ios - 仅禁用模拟器的应用程序传输安全

适用于多种服务的 iOS 9 应用程序传输安全

ios - 应用程序传输安全已禁用,但仍然出现 SSL 握手错误

ios - 将新对象添加到检索到的 NSMutableArray - 返回 NSInternalInconsistencyException

ios - 向表中显示少量数据并在后台运行Web服务

iphone - 将 UISearchBar 与 NSAttributedStrings 结合使用以增强搜索文本

ios - 在 View Controller 之上添加 SLComposeServiceViewController