Xamarin.iOS 中的應用程式傳輸安全性

應用程式傳輸安全性 (ATS) 會強制執行因特網資源(例如應用程式後端伺服器)與應用程式之間的安全連線。

本文將介紹應用程式傳輸安全性在iOS 9應用程式上強制執行的安全性變更,以及 這對您的 Xamarin.iOS 專案意味著什麼,其涵蓋 ATS 組態選項 ,並涵蓋如何 視需要退出 ATS ATS。 由於 ATS 預設為啟用,因此任何不安全的因特網連線都會在 iOS 9 應用程式中引發例外狀況(除非您已明確允許它)。

關於應用程式傳輸安全性

如上所述,ATS 可確保 iOS 9 和 OS X El Capitan 中的所有因特網通訊都符合安全的連線最佳做法,藉此防止不小心透過您的應用程式或取用的連結庫洩漏敏感性資訊。

對於現有的應用程式,請盡可能實作通訊 HTTPS 協定。 針對新的 Xamarin.iOS 應用程式,您應該在與因特網資源通訊時獨佔使用 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,因此使用 NSUrl 連線 ionCFUrl 或 NSUrlSession 的所有連線都將受限於 ATS 安全性需求。 如果您的連線不符合這些需求,這些連線將會失敗併發生例外狀況。

ATS 連線 ion 需求

ATS 會針對所有因特網連線強制執行下列需求:

  • 所有連線密碼都必須使用正向密碼。 請參閱下方接受的加密清單。
  • 傳輸層安全性 (TLS) 通訊協議必須是 1.2 版或更新版本。
  • 至少必須針對所有憑證使用 2048 位或更高 RSA 金鑰的 SHA256 指紋,或是 256 位或更高橢圓曲線 (ECC) 金鑰。

同樣地,由於 iOS 9 預設會啟用 ATS,因此任何嘗試建立不符合這些需求的連線,都會導致擲回例外狀況。

ATS 相容加密

ATS 安全因特網通訊接受下列正向密碼類型:

  • 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 因特網通訊類別的詳細資訊,請參閱 Apple 的 NSURL 連線 ion 類別參考NSURLSession 類別參考

在 Xamarin.iOS 中支援 ATS

因為 ATS 預設會在 iOS 9 和 OS X El Capitan 中啟用,如果您的 Xamarin.iOS 應用程式或任何連結庫或服務正在使用它進行因特網連線,您必須採取一些動作,否則您的聯機會導致擲回例外狀況。

針對現有的應用程式,Apple 建議您儘快支援通訊 HTTPS 協定。 如果您無法連線到不支援 HTTPS 的第三方Web服務,或者如果支援 HTTPS 是不切實際的,則可以退出宣告ATS。 如需詳細資訊,請參閱下方的 ATS 退出宣告一節。

對於新的 Xamarin.iOS 應用程式,您應該在與因特網資源通訊時獨佔使用 HTTPS 。 同樣地,在某些情況下(例如使用第三方Web服務),這是不可能的,您必須退出ATS。

此外,ATS 會強制執行高階 API 通訊,以使用 TLS 1.2 版與轉寄密碼進行加密。 如需詳細資訊,請參閱上述 ATS 連線 ion 需求ATS 相容密碼一節。

雖然您可能不熟悉 TLS(傳輸層安全性),但它是 SSL(安全套接字層)的繼任者,並提供密碼編譯通訊協定的集合,以強制執行透過網路連線的安全性。

TLS 層級是由您取用的 Web 服務所控制,因此不在應用程式的控制之外。 HttpClientModernHttpClient 應該會自動使用伺服器支援的最高 TLS 加密層級。

視您正在交談的伺服器而定(特別是如果是第三方服務),您可能需要停用轉寄保密或選取較低的 TLS 層級。 如需詳細資訊,請參閱下方的 設定 ATS 選項 一節。

重要

應用程式傳輸安全性不適用於使用 受控 HTTPClient 實作的 Xamarin 應用程式。 它僅適用於使用 CFNetwork HTTPClient 實 作或 NSURLSession HTTPClient 實作的 連線。

設定 HTTPClient 實作

若要設定 iOS 應用程式所使用的 HTTPClient 實作,請按兩下 方案總管 中的 [專案] 以開啟 [項目選項]。 流覽至 [iOS 組建],然後在 [HttpClient 實作] 下拉式清單中選取所需的用戶端類型:

Setting the iOS Build Options

Managed 處理程式

Managed 處理程式是已隨附於舊版 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 檢視連線到因特網時,您可能會在表單中收到錯誤:

應用程式傳輸安全性已封鎖純文本 HTTP (http://www.-the-blocked-domain.com) 資源負載,因為它不安全。 您可以透過您應用程式的 Info.plist 檔案來設定暫時例外狀況。

在 iOS9 中,應用程式傳輸安全性 (ATS) 會在因特網資源(例如應用程式的後端伺服器)和您的應用程式之間強制執行安全連線。 此外,ATS 需要使用通訊協定和高階 API 通訊進行通訊 HTTPS ,才能使用 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) - 如果未YES列出的NSExceptionDomains任何網域停用 ATS。 針對列出的網域,將會使用指定的安全性設定。
  • NSAllowsArbitraryLoadsInWebContentBoolean) - 如果 YES 允許網頁正確載入,Apple Transport Security (ATS) 保護仍會針對應用程式的其餘部分啟用。
  • NSExceptionDomainsDictionary) - 網域集合,以及 ATS 應該用於指定網域的安全性設定。
  • <domain-name-for-exception-as-string>Dictionary) - 指定網域的例外狀況集合(例如 )。 www.xamarin.com
  • NSExceptionMinimumTLSVersionString) - 最低 TLS 版本為 TLSv1.0TLSv1.1TLSv1.2 (這是預設值)。
  • NSExceptionRequiresForwardSecrecyBoolean) - 如果 NO 網域不需要使用具有正向安全性的加密。 預設值是 YES
  • NSExceptionAllowsInsecureHTTPLoadsBoolean) - 如果 NO (預設值) 與這個網域的所有通訊都必須在通訊協定中 HTTPS
  • NSRequiresCertificateTransparencyBoolean) - 如果 YES 網域的安全套接字層 (SSL) 必須包含有效的透明度數據。 預設值是 NO
  • NSIncludesSubdomainsBoolean) - 如果 YES 這些設定會覆寫此網域的所有子域。 預設值是 NO
  • NSThirdPartyExceptionMinimumTLSVersionString) - 網域是開發人員控件之外的第三方服務時所使用的 TLS 版本。
  • NSThirdPartyExceptionRequiresForwardSecrecyBoolean) - 如果 YES 第三方網域需要轉寄密碼。
  • NSThirdPartyExceptionAllowsInsecureHTTPLoadsBoolean) - 如果 YES ATS 允許與第三方網域進行不安全的通訊。

退出宣告 ATS

雖然 Apple 強烈建議使用通訊 HTTPS 協定和安全與因特網信息通訊,但有時候這並非總是可能的。 例如,如果您要與第三方 Web 服務通訊,或在應用程式中使用因特網傳遞的廣告。

如果您的 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 內容,請將下列內容新增至您 app 的 Info.plist 檔案,以允許網頁正確載入,而 Apple Transport Security (ATS) 保護仍會啟用應用程式的其餘部分:

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

您可以選擇性地對應用程式的 Info.plist 檔案進行下列變更,以完全停用所有網域和因特網通訊的 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 輸入網域作為例外狀況,而不是使用 完全 NSAllowsArbitraryLoads關閉 ATS。 NSAllowsArbitraryLoads 只應用於極端的緊急情況下。

同樣地,如果切換至安全連線無法使用或不切實際,則只能使用停用 ATS 作為最後手段。

摘要

本文介紹應用程式傳輸安全性(ATS),並說明其強制執行與因特網安全通訊的方式。 首先,我們已討論在iOS 9上執行的 Xamarin.iOS 應用程式所需的 ATS 變更。 然後,我們涵蓋了控制 ATS 功能和選項。 最後,我們已討論如何在您的 Xamarin.iOS 應用程式中退出宣告 ATS。