【问题标题】:Is it possible to modify ATS settings programmatically是否可以以编程方式修改 ATS 设置
【发布时间】:2023-04-06 04:45:01
【问题描述】:

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

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

我现在知道的选项:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 能否也检查一下这种情况下服务器使用的加密方式? IE 警告如果 sha1?
    • @lostintranslation 会话本身允许设置TLSMinimumSupportedProtocol,但我不知道读取当前状态的方法,因此如果您需要强制执行协议设置。
    【解决方案2】:

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

    对您问题中的陈述的一个更正:

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

    选项 1 不会使所有流量都不受保护。禁用 ATS 仅意味着 Apple 无法保证应用程序的流量受到保护。如果您使用具有适当强密钥和转发保密性的 SSL 连接到服务器,则 连接将是安全的。但它也允许您通过 HTTP 连接到不同的服务器,几乎没有提供保护。所以选项 1 不会剥夺任何安全性,它只是意味着您的用户不能期望所有与服务器相关的流量都是安全的。

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

    【讨论】:

    • 谢谢@wottle!糟糕的是,这是我所期望的答案,但希望我错过了一些东西。不受保护的问题更多的是防止中间人攻击。如果 ATS 关闭,即使我适当地使用 SSL 访问服务器,也有人可以“伪造”该服务器证书,而我的应用程序(使用 ATS)关闭仍将接受该“无效”连接。无论如何,看来我必须想出一个更好的主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多