Zabezpečení přenosu aplikací v Xamarin.iOS

App Transport Security (ATS) vynucuje zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a vaší aplikací.

V tomto článku se seznámíte se změnami zabezpečení, které Služba App Transport Security vynucuje u aplikace pro iOS 9 a co to znamená pro vaše projekty Xamarin.iOS, bude se zabývat možnostmi konfigurace ATS a v případě potřeby se bude zabývat tím, jak se ats ATS odhlásit . Vzhledem k tomu, že je atS ve výchozím nastavení povolená, všechna nezabezpečená připojení k internetu v aplikacích pro iOS 9 vyvolá výjimku (pokud jste ji explicitně nepovolili).

Informace o službě App Transport Security

Jak je uvedeno výše, ATS zajišťuje, aby veškerá internetová komunikace v iOSu 9 a OS X El Capitan odpovídala osvědčeným postupům zabezpečeného připojení, a tím brání náhodnému zpřístupnění citlivých informací přímo prostřednictvím vaší aplikace nebo knihovny, kterou využívá.

Pro existující aplikace implementujte HTTPS protokol, kdykoli je to možné. Pro nové aplikace Xamarin.iOS byste měli používat HTTPS výhradně při komunikaci s internetovými prostředky. Kromě toho musí být komunikace rozhraní API vysoké úrovně šifrovaná pomocí protokolu TLS verze 1.2 s předáváním tajemství.

Jakékoli připojení vytvořené pomocí NSUrlConnection, CFUrl nebo NSUrlSession bude ve výchozím nastavení používat ATS v aplikacích vytvořených pro iOS 9 a OS X 10.11 (El Capitan).

Výchozí chování ATS

Vzhledem k tomu, že je ATS ve výchozím nastavení povolená v aplikacích vytvořených pro iOS 9 a OS X 10.11 (El Capitan), budou všechna připojení využívající NSUrlConnection, CFUrl nebo NSUrlSession podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tento požadavek, nezdaří se s výjimkou.

Požadavky na připojení ATS

ATS vynucuje pro všechna připojení k internetu následující požadavky:

  • Všechny šifry připojení musí používat předávací tajemství. Podívejte se na seznam přijatých šifer níže.
  • Protokol TLS (Transport Layer Security) musí být verze 1.2 nebo vyšší.
  • Alespoň otisk prstu SHA256 s 2048 bitem nebo větším klíčem RSA nebo 256 bitem nebo větším klíčem Elliptic-Curve (ECC) musí být použit pro všechny certifikáty.

Znovu, protože ats je ve výchozím nastavení povolen v iOSu 9, jakýkoli pokus o připojení, které nesplňuje tyto požadavky, způsobí vyvolání výjimky.

Šifry kompatibilní s ATS

Následující typ šifry předávání přijímá zabezpečená internetová komunikace 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

Další informace o práci s internetovými komunikačními třídami pro iOS naleznete v referenčních informacích ke třídě NSURLConnection společnosti Apple, referenční dokumentace CFURL nebo NSURLSession – reference ke třídě.

Podpora ATS v Xamarin.iOS

Vzhledem k tomu, že atS je ve výchozím nastavení povolená v iOSu 9 a OS X El Capitan, pokud vaše aplikace Xamarin.iOS nebo jakákoli knihovna nebo služba používá připojení k internetu, budete muset provést nějakou akci nebo vaše připojení způsobí vyvolání výjimky.

U existující aplikace Apple navrhuje co nejdříve podporovat HTTPS protokol. Pokud buď nemůžete, protože se připojujete k webové službě třetí strany, která nepodporuje HTTPS nebo pokud by podpora HTTPS byla nepraktická, můžete ats odhlásit. Další podrobnosti najdete v části Odhlášení z ATS níže.

Pro novou aplikaci Xamarin.iOS byste měli používat HTTPS výhradně při komunikaci s internetovými prostředky. Opět může dojít k situacím (jako je použití webové služby třetí strany), kdy to není možné a budete se muset odhlásit ze služby ATS.

AtS navíc vynucuje šifrování komunikace rozhraní API vysoké úrovně pomocí protokolu TLS verze 1.2 s předáváním tajemství. Další podrobnosti najdete v části Požadavky na připojení ATS a šifry kompatibilní se službou ATS.

I když možná nejste obeznámeni s protokolem TLS (Transport Layer Security), jedná se o následníka SSL (Secure Socket Layer) a poskytuje kolekci kryptografických protokolů pro vynucení zabezpečení síťových připojení.

Úroveň TLS je řízena webovou službou, kterou využíváte, a proto je mimo kontrolu aplikace. HttpClientModernHttpClient Server by měl automaticky používat nejvyšší úroveň šifrování TLS podporovaného serverem.

V závislosti na serveru, se kterým mluvíte (zejména pokud se jedná o službu třetí strany), možná budete muset zakázat předávací tajemství nebo vybrat nižší úroveň protokolu TLS. Další podrobnosti najdete v části Konfigurace možností ATS níže.

Důležité

App Transport Security se nevztahuje na aplikace Xamarin pomocí spravovaných implementací HTTPClient. Vztahuje se pouze na připojení používající implementace CFNetwork HTTPClient nebo implementace NSURLSession HTTPClient .

Nastavení implementace HTTPClient

Pokud chcete nastavit implementaci HTTPClient používanou aplikací pro iOS, poklikejte na Project v Průzkumník řešení a otevřete Project Možnosti. Přejděte na build iOS a v rozevíracím seznamu implementace HttpClient vyberte požadovaný typ klienta:

Setting the iOS Build Options

Spravovaná obslužná rutina

Spravovaná obslužná rutina je plně spravovaná obslužná rutina HttpClient, která byla dodána s předchozími verzemi Xamarin.iOS a je výchozí obslužnou rutinou.

Profesionály:

  • Je to nejkomppatibilnější s microsoft .NET a starší verzí Xamarinu.

Nevýhody:

  • Není plně integrovaný s iOSem (např. je omezen na PROTOKOL TLS 1.0).
  • Obvykle je mnohem pomalejší než nativní rozhraní API.
  • Vyžaduje více spravovaného kódu a vytváří větší aplikace.

Obslužná rutina CFNetwork

Obslužná rutina založená na CFNetwork je založená na nativním CFNetwork rozhraní.

Profesionály:

  • Používá nativní rozhraní API pro lepší výkon a menší velikosti spustitelných souborů.
  • Přidává podporu pro novější standardy, jako je TLS 1.2.

Nevýhody:

  • Vyžaduje iOS 6 nebo novější.
  • Není k dispozici watchOS.
  • Některé funkce a možnosti HttpClient nejsou k dispozici.

Obslužná rutina NSUrlSession

Obslužná rutina založená na NSUrlSession je založená na nativním NSUrlSession rozhraní API.

Profesionály:

  • Používá nativní rozhraní API pro lepší výkon a menší velikosti spustitelných souborů.
  • Přidává podporu pro novější standardy, jako je TLS 1.2.

Nevýhody:

  • Vyžaduje iOS 7 nebo novější.
  • Některé funkce a možnosti HttpClient nejsou k dispozici.

Diagnostika problémů s ATS

Při pokusu o připojení k internetu( přímo nebo z webového zobrazení v iOSu 9) se může zobrazit chyba ve formuláři:

Služba App Transport Security zablokovala načtení prostředku HTTP (http://www.-the-blocked-domain.comcleartext), protože je nezabezpečené. Dočasné výjimky je možné nakonfigurovat prostřednictvím souboru Info.plist vaší aplikace.

V iOS9 vynucuje App Transport Security (ATS) zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a vaší aplikací. AtS navíc vyžaduje komunikaci pomocí HTTPS protokolu a komunikace rozhraní API vysoké úrovně, která se má šifrovat pomocí protokolu TLS verze 1.2 s předáváním tajemství.

Vzhledem k tomu, že ats je ve výchozím nastavení povolená v aplikacích vytvořených pro iOS 9 a OS X 10.11 (El Capitan), všechna připojení používající NSURLConnectionCFURL nebo NSURLSession budou podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tento požadavek, nezdaří se s výjimkou.

Apple také poskytuje ukázkovou aplikaci TLSTool , která se dá zkompilovat (nebo volitelně překódovat do Xamarinu a C#) a použít k diagnostice problémů s ATS/TLS. Informace o řešení tohoto problému najdete v části Odhlášení z ATS níže.

Konfigurace možností ATS

Několik funkcí ATS můžete nakonfigurovat nastavením hodnot pro konkrétní klíče v souboru Info.plist vaší aplikace. K dispozici jsou následující klíče pro řízení ATS (odsazené, aby se ukázalo, jak jsou vnořené):

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

Každý klíč má následující typ a význam:

  • NSAppTransportSecurity (Dictionary) – obsahuje všechny klíče a hodnoty nastavení pro ATS.
  • NSAllowsArbitraryLoads (Boolean) – Pokud YES bude ATS zakázaná pro libovolnou doménu , která není uvedená v NSExceptionDomainsseznamu . Pro uvedené domény se použijí zadaná nastavení zabezpečení.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) – Pokud YES webové stránky umožní správně načíst, zatímco ochrana Apple Transport Security (ATS) je stále povolená pro zbytek aplikace.
  • NSExceptionDomains (Dictionary) – kolekce domén, které a nastavení zabezpečení, které ATS má pro danou doménu používat.
  • <domain-name-for-exception-as-string> (Dictionary) – kolekce výjimek pro danou doménu (např. www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String) – minimální verze protokolu TLS jako nebo TLSv1.0TLSv1.1TLSv1.2 (což je výchozí).
  • NSExceptionRequiresForwardSecrecy (Boolean) – Pokud NO doména nemusí používat šifru s předáváním zabezpečení. Výchozí hodnota je YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) – Pokud NO (výchozí) veškerá komunikace s touto doménou HTTPS musí být v protokolu.
  • NSRequiresCertificateTransparency (Boolean) – Pokud YES musí protokol SSL (Secure Sockets Layer) domény obsahovat platná data průhlednosti. Výchozí hodnota je NO.
  • NSIncludesSubdomains (Boolean) – Pokud YES tato nastavení přepíšou všechny subdomény této domény. Výchozí hodnota je NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) – verze PROTOKOLU TLS použitá při doméně je služba třetí strany mimo řízení vývojáře.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) – Pokud YES doména třetí strany vyžaduje předávání tajemství.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) – Pokud YES ATS povolí nezabezpečenou komunikaci s doménami třetích stran.

Opting-Out ATS

I když Společnost Apple důrazně navrhuje používat HTTPS protokol a zabezpečenou komunikaci s internetovými informacemi, může se stát, že to není vždy možné. Pokud například komunikujete s webovou službou třetí strany nebo používáte internetové reklamy doručované ve vaší aplikaci.

Pokud vaše aplikace Xamarin.iOS musí provést požadavek na nezabezpečenou doménu, následující změny v souboru Info.plist vaší aplikace zakažou výchozí hodnoty zabezpečení, které ATS pro danou doménu vynucuje:

<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>

Uvnitř Visual Studio pro Mac poklikejte na Info.plist soubor v Průzkumník řešení, přepněte do zobrazení Zdroj a přidejte výše uvedené klíče:

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

Pokud vaše aplikace potřebuje načíst a zobrazit webový obsah z nezabezpečených webů, přidejte do souboru Info.plist vaší aplikace následující informace, aby se webové stránky správně načetly, zatímco pro zbytek aplikace je stále povolená ochrana Apple Transport Security (ATS):

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

Volitelně můžete v souboru Info.plist vaší aplikace provést následující změny, které úplně zakáže ATS pro všechny domény a internetovou komunikaci:

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

Uvnitř Visual Studio pro Mac poklikejte na Info.plist soubor v Průzkumník řešení, přepněte do zobrazení Zdroj a přidejte výše uvedené klíče:

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

Důležité

Pokud vaše aplikace vyžaduje připojení k nezabezpečenému webu, měli byste vždy zadat doménu jako výjimku místo NSExceptionDomains úplné vypnutí ATS pomocí NSAllowsArbitraryLoads. NSAllowsArbitraryLoads by měly být použity pouze v extrémních nouzových situacích.

Opět platí, že zakázání ATS by mělo být použito pouze jako poslední možnost, pokud je přepnutí na zabezpečená připojení nedostupná nebo nepraktická.

Souhrn

Tento článek představil App Transport Security (ATS) a popsal způsob, jakým vynucuje zabezpečenou komunikaci s internetem. Nejprve jsme probrali změny, které ATS vyžaduje pro aplikaci Xamarin.iOS spuštěnou v iOSu 9. Pak jsme se zabývali řízením funkcí a možností ATS. Nakonec jsme probrali výslovný nesouhlas se službou ATS ve vaší aplikaci Xamarin.iOS.