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 連線 ion、CFUrl 或 NSUrlSession 建立的任何連線,預設都會在針對 iOS 9 和 OS X 10.11 (El Capitan) 建置的應用程式中使用 ATS。
預設 ATS 行為
由於針對 iOS 9 和 OS X 10.11 (El Capitan) 建置的應用程式預設會啟用 ATS,因此使用 NSUrl 連線 ion、CFUrl 或 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 服務所控制,因此不在應用程式的控制之外。 HttpClient
和 ModernHttpClient
應該會自動使用伺服器支援的最高 TLS 加密層級。
視您正在交談的伺服器而定(特別是如果是第三方服務),您可能需要停用轉寄保密或選取較低的 TLS 層級。 如需詳細資訊,請參閱下方的 設定 ATS 選項 一節。
重要
應用程式傳輸安全性不適用於使用 受控 HTTPClient 實作的 Xamarin 應用程式。 它僅適用於使用 CFNetwork HTTPClient 實 作或 NSURLSession HTTPClient 實作的 連線。
設定 HTTPClient 實作
若要設定 iOS 應用程式所使用的 HTTPClient 實作,請按兩下 方案總管 中的 Project 以開啟 [項目選項]。 流覽至 [iOS 組建],然後在 [HttpClient 實作] 下拉式清單中選取所需的用戶端類型:
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
所有使用 NSURLConnection
CFURL
的連線都會受限於 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
每個索引鍵都有下列類型和意義:
- NSAppTransportSecurity (
Dictionary
) - 包含 ATS 的所有設定索引鍵和值。 - NSAllowsArbitraryLoads (
Boolean
) - 如果未YES
列出的NSExceptionDomains
任何網域停用 ATS。 針對列出的網域,將會使用指定的安全性設定。 - NSAllowsArbitraryLoadsInWebContent (
Boolean
) - 如果YES
允許網頁正確載入,Apple Transport Security (ATS) 保護仍會針對應用程式的其餘部分啟用。 - NSExceptionDomains (
Dictionary
) - 網域集合,以及 ATS 應該用於指定網域的安全性設定。 - <domain-name-for-exception-as-string> (
Dictionary
) - 指定網域的例外狀況集合(例如 )。www.xamarin.com
- NSExceptionMinimumTLSVersion (
String
) - 最低 TLS 版本為TLSv1.0
或TLSv1.1
TLSv1.2
(這是預設值)。 - NSExceptionRequiresForwardSecrecy (
Boolean
) - 如果NO
網域不需要使用具有正向安全性的加密。 預設值是YES
。 - NSExceptionAllowsInsecureHTTPLoads (
Boolean
) - 如果NO
(預設值) 與這個網域的所有通訊都必須在通訊協定中HTTPS
。 - NSRequiresCertificateTransparency (
Boolean
) - 如果YES
網域的安全套接字層 (SSL) 必須包含有效的透明度數據。 預設值是NO
。 - NSIncludesSubdomains (
Boolean
) - 如果YES
這些設定會覆寫此網域的所有子域。 預設值是NO
。 - NSThirdPartyExceptionMinimumTLSVersion (
String
) - 網域是開發人員控件之外的第三方服務時所使用的 TLS 版本。 - NSThirdPartyExceptionRequiresForwardSecrecy (
Boolean
) - 如果YES
第三方網域需要轉寄密碼。 - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) - 如果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
方案總管 中的檔案,切換至 [來源] 檢視,然後新增上述索引鍵:
如果您的應用程式需要從非安全網站載入及顯示 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
方案總管 中的檔案,切換至 [來源] 檢視,然後新增上述索引鍵:
重要
如果您的應用程式需要連線到不安全的網站,您應該 一律 使用 NSExceptionDomains
輸入網域作為例外狀況,而不是使用 完全 NSAllowsArbitraryLoads
關閉 ATS。 NSAllowsArbitraryLoads
只應用於極端的緊急情況下。
同樣地,如果切換至安全連線無法使用或不切實際,則只能使用停用 ATS 作為最後手段。
摘要
本文介紹應用程式傳輸安全性(ATS),並說明其強制執行與因特網安全通訊的方式。 首先,我們已討論在iOS 9上執行的 Xamarin.iOS 應用程式所需的 ATS 變更。 然後,我們涵蓋了控制 ATS 功能和選項。 最後,我們已討論如何在您的 Xamarin.iOS 應用程式中退出宣告 ATS。