微调您的 App 传输安全设置
2021 年 6 月 16 日
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/03550F41-C2F2-4F02-8524-779823519DDC/2048.jpeg)
Apple 认为隐私是一项基本人权。当用户连接到公共 Wi-Fi 热点时,他们希望使用您的 app 来发送和接收数据,而无需担忧附近有人能够拦截他们的连接,获取对未加密数据的访问权限。如果任由数据保持未加密状态,即便这些数据似乎非常普通,也可能让用户遭到网络黑客的窥探和指纹攻击。
传输层安全协议 (TLS) 使用加密来保护连接以防止窥探,URLSession 在默认情况下使用 App 传输安全 (ATS),提供稳定的 TLS 连接。
但是,如果您需要连接到不支持 TLS 的较旧的老服务器,则可以为您的 app 添加 ATS 例外。理想情况下,例外应该仅排除那些导致连接不安全的特定域或框架,您应该限制任何例外的请求数量。同时应避免发送未加密的数据,除非是 app 正常工作时必需的功能。
识别必需的 ATS 例外
为了确保您的 app 及其内部数据尽可能安全,必须确定该 app 当前的连接是否安全,这一点非常重要。
要进行检查,请将 Info.plist 中的活动 ATS 例外的值设置为“NO”,从而禁用这些例外。此时, 请打开您的 app 或运行单元测试。如果该 app 的连接不安全,Xcode 将为每个连接生成运行时错误。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/70CC4194-10F9-4A92-B7A0-8A779E7E5171/2048.jpeg)
如果该 app 生成了不安全连接,您可以执行几个步骤来移除这些连接。
保护您的服务器
如果您的 app 连接到受您控制的服务器,请确保这些服务器支持安全连接。这需要 TLS 证书。如果您使用托管服务,请检测它们是否提供证书,并确保这些证书符合在“防止不安全的网络连接”中详细说明的要求。
Preventing Insecure Network Connections
如果您的 app 连接到您无法控制的服务器,则应始终通过 HTTPS 连接到这些服务器,而不是通过 HTTP。您可将 URL 字符串中的“http://”更改为“https://”,尝试加载来自该网站的数据,以此确定服务器是否支持 HTTPS。您可在浏览器中手动执行此检查,或者运行以下代码:
很多网站将 HTTP 连接重定向至 HTTPS。首先通过 HTTPS 进行连接,通常能够提高 app 的性能。但要注意,虽然网站可能使用 HTTPS,但并不意味着它兼容 ATS。例如,网站可能使用过时版本的 TLS,在 Safari 浏览器上将会显示“此连接非私人连接”警告。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/7B8D629B-B2E9-4215-911F-1CE7E0FD8626/2048.jpeg)
移除非必需的例外 在您不再收到 ATS 运行时错误的网站上,您可以移除这些例外。在 Info.plist 中找到“App Transport Security Settings”,并点按“—”图标以移除相应的例外。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/62FD7CB9-4B91-43F5-93B3-561D194F6E9A/2048.jpeg)
配置例外域
如果您的 app 仍然需要与特定域进行不安全连接,您可以只针对这些域配置 ATS 例外。
将例外域直接添加到您的 app 的 Info.plist,或者在项目编辑器中添加。请至“Signing & Capabilities”,并选择“+ Capability”选项。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/D4784F2B-BBF8-48B8-BA9A-26F5DFBCF167/2048.jpeg)
从列表中选择“App Transport Security Exception”。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/6712D1DA-CAA2-4D69-97DE-97AE26C86547/2048.jpeg)
这样可将“App Transport Security Exception”部分添加到您的功能:
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/98F86ECB-7C16-4160-8E48-71920F7E0257/2048.jpeg)
- 点按“+”图标,添加您的 app 需要通过不安全方式连接的域。 在此处输入域,以便通过 HTTP 连接到该域及其子域。如果您需要修改这些设置,可直接在 Info.plist 中进行更改。
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/76EE24AF-ED88-41D8-9D2D-963BD79BC874/2048.jpeg)
配置框架和类例外
在极少数情况下,您仍然需要与未知域进行不安全连接。此类情况下,您可以考虑使用两个比较宽泛的例外。
如果您的 app 需要通过 WKWebView 进行不安全连接,请将“Allows Arbitrary Loads In Web Content”添加到 Info.plist:
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/2821E5D7-C24A-4917-8D2B-8F1C72B8D9BC/2048.jpeg)
如果您的 app 需要通过 AVFoundation 进行不安全连接,请将“Allows Arbitrary Loads for Media”添加到 Info.plist:
![](https://devimages-cdn.apple.com/wwdc-services/articles/images/91D8661C-4000-430E-BAD7-1D482D326F35/2048.jpeg)
这些例外确保您的 app 只会通过 AVFoundation 或 WKWebView 进行不安全连接,而让 app 的其他部分受到 ATS 的保护。但是,由于它们是相对宽泛的例外,它们将允许 app 的每个部分使用 AVFoundation 或 WKWebView 进行不安全连接,这些连接可能被拦截和检测。
确保您的 app 安全
用户希望您的 app 是可信的,而 ATS 可以通过在传输过程中谨慎地处理数据,帮助您建立这种信任。进行以下操作,充分利用 ATS:
- 确保您的 app 通过 HTTPS 连接到这些服务器,而不是通过 HTTP。
- 针对您的 app,尽可能贴切地量身定制 ATS 例外。 定期检查例外,确认服务器是否开始支持 HTTPS,或者您的 app 不再需要与这些服务器进行不安全连接。
资源
Preventing Insecure Network Connections
NSAllowsArbitraryLoadsForMedia
NSAllowsArbitraryLoadsInWebContent
Learn more about App Transport Security on the Developer Forums