微调您的 App 传输安全设置

Apple 认为隐私是一项基本人权。当用户连接到公共 Wi-Fi 热点时,他们希望使用您的 app 来发送和接收数据,而无需担忧附近有人能够拦截他们的连接,获取对未加密数据的访问权限。如果任由数据保持未加密状态,即便这些数据似乎非常普通,也可能让用户遭到网络黑客的窥探和指纹攻击。

传输层安全协议 (TLS) 使用加密来保护连接以防止窥探,URLSession 在默认情况下使用 App 传输安全 (ATS),提供稳定的 TLS 连接。

但是,如果您需要连接到不支持 TLS 的较旧的老服务器,则可以为您的 app 添加 ATS 例外。理想情况下,例外应该仅排除那些导致连接不安全的特定域或框架,您应该限制任何例外的请求数量。同时应避免发送未加密的数据,除非是 app 正常工作时必需的功能。

识别必需的 ATS 例外

为了确保您的 app 及其内部数据尽可能安全,必须确定该 app 当前的连接是否安全,这一点非常重要。

要进行检查,请将 Info.plist 中的活动 ATS 例外的值设置为“NO”,从而禁用这些例外。此时,
请打开您的 app 或运行单元测试。如果该 app 的连接不安全,Xcode 将为每个连接生成运行时错误。

如果该 app 生成了不安全连接,您可以执行几个步骤来移除这些连接。

保护您的服务器

如果您的 app 连接到受您控制的服务器,请确保这些服务器支持安全连接。这需要 TLS 证书。如果您使用托管服务,请检测它们是否提供证书,并确保这些证书符合在“防止不安全的网络连接”中详细说明的要求。

Preventing Insecure Network Connections

如果您的 app 连接到您无法控制的服务器,则应始终通过 HTTPS 连接到这些服务器,而不是通过 HTTP。您可将 URL 字符串中的“http://”更改为“https://”,尝试加载来自该网站的数据,以此确定服务器是否支持 HTTPS。您可在浏览器中手动执行此检查,或者运行以下代码:

很多网站将 HTTP 连接重定向至 HTTPS。首先通过 HTTPS 进行连接,通常能够提高 app 的性能。但要注意,虽然网站可能使用 HTTPS,但并不意味着它兼容 ATS。例如,网站可能使用过时版本的 TLS,在 Safari 浏览器上将会显示“此连接非私人连接”警告。

移除非必需的例外 在您不再收到 ATS 运行时错误的网站上,您可以移除这些例外。在 Info.plist 中找到“App Transport Security Settings”,并点按“—”图标以移除相应的例外。

配置例外域

如果您的 app 仍然需要与特定域进行不安全连接,您可以只针对这些域配置 ATS 例外。

将例外域直接添加到您的 app 的 Info.plist,或者在项目编辑器中添加。请至“Signing & Capabilities”,并选择“+ Capability”选项。

从列表中选择“App Transport Security Exception”。

这样可将“App Transport Security Exception”部分添加到您的功能:

  • 点按“+”图标,添加您的 app 需要通过不安全方式连接的域。 在此处输入域,以便通过 HTTP 连接到该域及其子域。如果您需要修改这些设置,可直接在 Info.plist 中进行更改。

配置框架和类例外

在极少数情况下,您仍然需要与未知域进行不安全连接。此类情况下,您可以考虑使用两个比较宽泛的例外。

如果您的 app 需要通过 WKWebView 进行不安全连接,请将“Allows Arbitrary Loads In Web Content”添加到 Info.plist:

如果您的 app 需要通过 AVFoundation 进行不安全连接,请将“Allows Arbitrary Loads for Media”添加到 Info.plist:

这些例外确保您的 app 只会通过 AVFoundation 或 WKWebView 进行不安全连接,而让 app 的其他部分受到 ATS 的保护。但是,由于它们是相对宽泛的例外,它们将允许 app 的每个部分使用 AVFoundation 或 WKWebView 进行不安全连接,这些连接可能被拦截和检测。

确保您的 app 安全

用户希望您的 app 是可信的,而 ATS 可以通过在传输过程中谨慎地处理数据,帮助您建立这种信任。进行以下操作,充分利用 ATS:

  • 确保您的 app 通过 HTTPS 连接到这些服务器,而不是通过 HTTP。
  • 针对您的 app,尽可能贴切地量身定制 ATS 例外。 定期检查例外,确认服务器是否开始支持 HTTPS,或者您的 app 不再需要与这些服务器进行不安全连接。

资源

NSAppTransportSecurity

Preventing Insecure Network Connections

NSExceptionDomains

NSAllowsArbitraryLoadsForMedia

NSAllowsArbitraryLoadsInWebContent

WKWebView

Learn more about App Transport Security on the Developer Forums