管理应用传输安全 — iOS 和 macOS

本指南讨论 Apple 的应用传输安全 (ATS) 以及如何在您的应用中管理它。

概述

Apple 在其操作系统的每个主要升级中都会引入所有 iOS 和 macOS 开发人员都必须了解的新功能。在 iOS 9 和 macOS 10.11 中,引入了一项特别重要的功能,称为**应用传输安全**,以下简称 **ATS**。

本质上,ATS 是 Apple 针对不安全的 HTTP 和较弱/较旧的 HTTPS 连接的新防护措施。Apple 建议您尽快采用 ATS,无论您是创建新应用还是更新现有应用。其目的是保护您的应用用户免受旧互联网协议中固有的漏洞的攻击,因此最好的方法始终是与其合作,而不是仅仅将其关闭(无论如何,Apple 将在不久的将来移除此选项)。

有关 ATS 的全面详细信息和使用规范,请参阅 Apple 的文档

先决条件

ATS 适用于满足以下条件的 iOS 和 macOS 应用:

有效连接

要允许连接通过 ATS,必须满足以下条件:

配置连接

重要

虽然我们提供此信息以供参考,但 Corona Labs **不**鼓励绕过任何连接的 ATS,因为其目的是保护用户的隐私。

可以将 ATS 配置为管理某些不满足上述有效连接要求的特定端点。以下步骤概述了此过程:

  1. 配置 ATS 从在应用的 `build.settings` 文件(指南)的键值对的`iphone` → `plist`表中添加 `NSAppTransportSecurity` 开始。
settings =
{
    iphone =
    {
        plist =
        {
            NSAppTransportSecurity =
            {

            },
        },
    },
}
  1. 在 `NSAppTransportSecurity` 表中,添加一个 `NSExceptionDomains`键值对。这允许您为特定域指定 ATS 例外。
NSAppTransportSecurity =
{
    NSExceptionDomains =
    {

    },
},
  1. 在 `NSExceptionDomains` 表中,包含不同的键值键值对来描述特定域的网络连接配置例外。例外域的顶级键是您要为其指定连接配置的域名字符串。由于 Lua 命名约定规则,您通常需要在括号/引号中指定这些名称,例如 `["example.com"]`。
NSAppTransportSecurity =
{
    NSExceptionDomains =
    {
        ["example.com"] =
        {

        },
    },
},
  1. 最后,要配置例外域,请包含键值键值对来描述特定服务器的例外,以区别于您应用的整体预期网络行为。例如:
NSAppTransportSecurity =
{
    NSExceptionDomains =
    {
        ["example.com"] =
        {
            NSIncludesSubdomains = true,
            NSThirdPartyExceptionAllowsInsecureHTTPLoads = true,
        },
    },
},

下表总结了有效选项。有关全面详细信息,请参阅 Apple 的文档

描述
NSIncludesSubdomains 布尔值 一个可选的布尔值,当设置为 `true` 时,会将 `NSExceptionDomains` 例外应用于名称为顶级键的域的所有子域。默认为 `false`。
NSExceptionAllowsInsecureHTTPLoads 布尔值 一个可选的布尔值,当设置为 `true` 时,允许不安全的 HTTP 加载。使用此键来描述您的应用对**可以**控制其安全属性的域的预期网络行为。默认为 `false`。
NSExceptionRequiresForwardSecrecy 布尔值 一个可选的布尔值,用于覆盖服务器支持前向保密 (FS) 的要求。使用此键来描述您的应用对**可以**控制其安全属性的域的预期网络行为。默认为 `true`。
NSExceptionMinimumTLSVersion 字符串 一个可选的字符串值,用于指定连接的最低传输层安全 (TLS) 版本。使用此键来描述您的应用对**可以**控制其安全属性的域的预期网络行为。默认值为 `TLSv1.2`。
NSThirdPartyExceptionAllowsInsecureHTTPLoads 布尔值 `NSExceptionAllowsInsecureHTTPLoads` 键的一个版本,用于配置对**无法**控制其安全属性的域的连接。
NSThirdPartyExceptionRequiresForwardSecrecy 布尔值 `NSExceptionRequiresForwardSecrecy` 键的一个版本,用于配置对**无法**控制其安全属性的域的连接。
NSThirdPartyExceptionMinimumTLSVersion 字符串 `NSExceptionMinimumTLSVersion` 键的一个版本,用于配置对**无法**控制其安全属性的域的连接。
  1. 综上所述,`build.settings` 中的 ATS 配置块示例可能如下所示:
settings =
{
    iphone =
    {
        plist =
        {
            NSAppTransportSecurity =
            {
                NSExceptionDomains =
                {
                    ["example.com"] =
                    {
                        NSIncludesSubdomains = true,
                        NSThirdPartyExceptionAllowsInsecureHTTPLoads = true,
                    },
                },
            },
        },
    },
}

绕过 ATS

作为最后的手段,还可以将 ATS 配置为默认**允许**不安全连接。这可以通过在 `NSAppTransportSecurity` 表中包含 `NSAllowsArbitraryLoads` 键并将其值设置为 `true` 来实现:

NSAppTransportSecurity =
{
    NSAllowsArbitraryLoads = true,
},
注意

如果您以这种方式全局绕过 ATS,仍然可以按照上述方法定义例外域。在这种情况下,您可以有效地**增加**对特定服务器的限制。例如,将命名服务器的 `NSExceptionAllowsInsecureHTTPLoads` 键的值设置为 `false` 将重新启用对该服务器的 HTTPS 强制执行。

Corona 模拟器

由于 macOS 上的 Corona 模拟器必须模拟所有类型的设备,包括未实现 ATS 的设备,因此它会对所有连接关闭 ATS。