Xamarin.iOS 中的应用传输安全性

应用传输安全(ATS)强制在 Internet 资源(例如应用的后端服务器)和应用之间建立安全连接。

本文将介绍应用传输安全对 iOS 9 应用强制执行的安全更改,以及 对于 Xamarin.iOS 项目意味着什么,它将涵盖 ATS 配置选项 ,并介绍如何 根据需要选择退出 ATS ATS 。 由于 ATS 默认处于启用状态,因此任何不安全的 Internet 连接都会在 iOS 9 应用中引发异常(除非显式允许它)。

关于应用传输安全性

如上所述,ATS 可确保 iOS 9 和 OS X El Capitan 中的所有 Internet 通信都符合安全连接最佳做法,从而防止直接通过应用或正在使用的库意外泄露敏感信息。

对于现有应用,请尽可能实现 HTTPS 协议。 对于新的 Xamarin.iOS 应用,应在与 Internet 资源通信时独占使用 HTTPS 。 此外,高级 API 通信必须使用 TLS 版本 1.2 和转发保密进行加密。

使用 NSUrl 建立的任何连接连接ionCFUrl 或 NSUrlSession 默认在为 iOS 9 和 OS X 10.11(El Capitan)生成的应用中使用 ATS。

默认 ATS 行为

由于为 iOS 9 和 OS X 10.11 (El Capitan) 生成的应用中默认启用了 ATS,因此使用 NSUrlConnectionCFUrlNSUrlSession 的所有连接都受 ATS 安全要求的约束。 如果连接不符合这些要求,它们将失败并出现异常。

ATS 连接ion 要求

ATS 将对所有 Internet 连接强制实施以下要求:

  • 所有连接密码都必须使用正向保密。 请参阅下面的接受密码列表。
  • 传输层安全性 (TLS) 协议必须是版本 1.2 或更高版本。
  • 至少具有 2048 位或更高 RSA 密钥的 SHA256 指纹,或 256 位或更大的椭圆曲线 (ECC) 密钥必须用于所有证书。

同样,由于在 iOS 9 中默认启用 ATS,因此尝试建立不符合这些要求的连接将导致引发异常。

ATS 兼容的密码

ATS 安全 Internet 通信接受以下前向保密密码类型:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

有关使用 iOS Internet 通信类的详细信息,请参阅 Apple 的 NSURL连接ion 类引用NSURLSession 类参考

支持 Xamarin.iOS 中的 ATS

由于 ATS 在 iOS 9 和 OS X El Capitan 中默认处于启用状态,因此,如果你的 Xamarin.iOS 应用或任何使用库或服务连接到 Internet,则需要采取一些操作,否则连接将导致引发异常。

对于现有应用,Apple 建议尽快支持该 HTTPS 协议。 如果你无法连接到不支持 HTTPS 的第三方 Web 服务,或者如果支持 HTTPS 是不切实际的,则可以选择退出 ATS。 有关更多详细信息,请参阅下面的“选择退出 ATS”部分。

对于新的 Xamarin.iOS 应用,应在与 Internet 资源通信时独占使用 HTTPS 。 同样,在某些情况下(例如使用第三方 Web 服务),这是不可能的,你需要选择退出 ATS。

此外,ATS 使用 TLS 版本 1.2 和转发保密来强制加密高级 API 通信。 有关更多详细信息,请参阅上面的 ATS 连接ion 要求ATS 兼容密码部分。

虽然你可能不熟悉 TLS(传输层安全性),但它是 SSL(安全套接字层)的继任者,并提供加密协议集合来强制通过网络连接实施安全性。

TLS 级别由正在使用的 Web 服务控制,因此不受应用控制。 HttpClientModernHttpClient服务器支持的 TLS 加密级别和应自动使用最高级别的 TLS 加密。

根据要与之通信的服务器(特别是如果是第三方服务),可能需要禁用转发保密或选择较低的 TLS 级别。 有关详细信息,请参阅下面的“配置 ATS 选项”部分。

重要

应用传输安全性不适用于使用托管 HTTPClient 实现的 Xamarin 应用。 它仅适用于使用 CFNetwork HTTPClient 实现NSURLSession HTTPClient 实现的连接

设置 HTTPClient 实现

若要设置 iOS 应用使用的 HTTPClient 实现,请双击解决方案资源管理器中的项目以打开项目选项。 导航到 iOS 生成并在 HttpClient 实现下拉列表下选择所需的客户端类型:

Setting the iOS Build Options

托管处理程序

托管处理程序是随早期版本的 Xamarin.iOS 一起提供的完全托管的 HttpClient 处理程序,是默认处理程序。

优点:

  • 它是与 Microsoft .NET 和旧版 Xamarin 最兼容的。

缺点:

  • 它未与 iOS 完全集成(例如仅限于 TLS 1.0)。
  • 它通常比本机 API 慢得多。
  • 它需要更多的托管代码并创建更大的应用。

CFNetwork 处理程序

基于 CFNetwork 的处理程序基于本机 CFNetwork 框架。

优点:

  • 使用本机 API 提高性能和较小的可执行大小。
  • 添加了对较新的标准(如 TLS 1.2)的支持。

缺点:

  • 需要 iOS 6 或更高版本。
  • 不支持 watchOS。
  • 某些 HttpClient 功能和选项不可用。

NSUrlSession 处理程序

基于 NSUrlSession 的处理程序基于本机 NSUrlSession API。

优点:

  • 使用本机 API 提高性能和较小的可执行大小。
  • 添加了对较新的标准(如 TLS 1.2)的支持。

缺点:

  • 需要 iOS 7 或更高版本。
  • 某些 HttpClient 功能和选项不可用。

诊断 ATS 问题

尝试直接或从 iOS 9 中的 Web 视图连接到 Internet 时,可能会收到以下格式的错误:

应用传输安全已阻止明文 HTTP (http://www.-the-blocked-domain.com) 资源加载,因为它不安全。 可以通过应用的 Info.plist 文件配置临时异常。

在 iOS9 中,应用传输安全(ATS)强制在 Internet 资源(例如应用的后端服务器)和应用之间建立安全连接。 此外,ATS 要求使用 HTTPS 协议和高级 API 通信进行通信,以便使用 TLS 版本 1.2 和转发保密进行加密。

由于 ATS 默认在为 iOS 9 和 OS X 10.11(El Capitan)生成的应用中启用,因此NSURLSession使用NSURLConnectionCFURL的所有连接或将受到 ATS 安全要求的约束。 如果连接不符合这些要求,它们将失败并出现异常。

Apple 还提供 TLSTool 示例应用,该应用 可以编译(或者选择性地转码为 Xamarin 和 C#),并用于诊断 ATS/TLS 问题。 有关如何解决此问题的信息,请参阅 下面的“选择退出 ATS ”部分。

配置 ATS 选项

可以通过在应用的 Info.plist 文件中为特定键设置值来配置 ATS 的多个功能。 以下键可用于控制 ATS(缩进以显示它们的嵌套方式):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

每个键具有以下类型和含义:

  • NSAppTransportSecurityDictionary) - 包含 ATS 的所有设置键和值。
  • NSAllowsArbitraryLoadsBoolean) - 对于未列出的NSExceptionDomains任何域,将YES禁用 ATS。 对于列出的域,将使用指定的安全设置。
  • NSAllowsArbitraryLoadsInWebContentBoolean) - 如果 YES 允许网页正确加载,而 Apple Transport Security (ATS) 保护仍为应用的其余部分启用。
  • N标准版xceptionDomainsDictionary) - ATS 应用于给定域的安全设置的域集合。
  • <domain-name-for-exception-as-string>Dictionary) - 给定域的异常集合(例如)。 www.xamarin.com
  • N标准版xceptionMinimumTLSVersionString) - 最低 TLS 版本TLSv1.0TLSv1.1TLSv1.2 (为默认值)。
  • N标准版xceptionRequiresForwardSecrecyBoolean) - 如果该NO域不必使用具有转发安全性的密码。 默认值为 YES
  • N标准版xceptionAllowsInsecureHTTPLoadsBoolean) - 如果NO(默认)与此域的所有通信都必须位于协议中HTTPS
  • NSRequiresCertificateTransparencyBoolean) - 如果 YES 域的安全套接字层 (SSL) 必须包含有效的透明度数据。 默认值为 NO
  • NSIncludesSubdomainsBoolean) - 如果 YES 这些设置覆盖此域的所有子域。 默认值为 NO
  • NSThirdPartyExceptionMinimumTLSVersionString) - 域是开发人员控制之外的第三方服务时使用的 TLS 版本。
  • NSThirdPartyExceptionRequiresForwardSecrecyBoolean) - 如果 YES 第三方域需要向前保密。
  • NSThirdPartyExceptionAllowsInsecureHTTPLoadsBoolean) - 如果 YES ATS 将允许与第三方域进行不安全的通信。

选择退出 ATS

虽然 Apple 强烈建议使用 HTTPS 协议和安全与基于 Internet 的信息通信,但有时这种情况并不总是可能的。 例如,如果要与第三方 Web 服务通信或在应用中使用 Internet 交付的广告。

如果 Xamarin.iOS 应用必须向不安全的域发出请求,则对应用的 Info.plist 文件的以下更改将禁用 ATS 对给定域强制实施的安全默认值:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

在 Visual Studio for Mac 中,双击Info.plist解决方案资源管理器中的文件,切换到视图并添加上述键:

The Source view of the Info.plist file after adding specified keys.

如果你的应用需要从非安全网站加载和显示 Web 内容,请将以下内容添加到应用的 Info.plist 文件,以允许网页正确加载,同时仍为应用的其余部分启用 Apple Transport Security (ATS) 保护:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

(可选)可以对应用的 Info.plist 文件进行以下更改,以对所有域和 Internet 通信完全禁用 ATS:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

在 Visual Studio for Mac 中,双击Info.plist解决方案资源管理器中的文件,切换到视图并添加上述键:

The Source view of the Info.plist file after specifying NSAllowsArbitraryLoadsInWebContent and NSAllowsArbitraryLoads.

重要

如果应用程序需要连接到不安全的网站,应 始终 使用 NSExceptionDomains 将域输入为例外,而不是完全使用 NSAllowsArbitraryLoadsATS 关闭。 NSAllowsArbitraryLoads 只能在极端紧急情况下使用。

同样,如果切换到安全连接不可用或不切实际,则禁用 ATS 只能用作最后手段。

总结

本文介绍了应用传输安全(ATS),并介绍了它强制执行与 Internet 的安全通信的方式。 首先,我们介绍了 ATS 对 iOS 9 上运行的 Xamarin.iOS 应用所做的更改。 然后,我们介绍了控制 ATS 功能和选项。 最后,我们介绍了如何在 Xamarin.iOS 应用中选择退出 ATS。