Zabezpečení přenosu aplikací v Xamarin.iOS
Služba App Transport Security (ATS) vynucuje zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a vaší aplikací.
Tento článek představí změny 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 bude se zabývat tím, jak se v případě potřeby odhlásit ze služby ATS ATS . 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í, čímž brání náhodnému zveřejně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é. U nových aplikací 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í NSUrl Připojení ion, CFUrl nebo NSUrlSession budou 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 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í využívající NSUrl Připojení ion, CFUrl nebo NSUrlSession budou podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tento požadavek, dojde k selhání s výjimkou.
Požadavky na Připojení ATS
ATS bude vynucovat následující požadavky pro všechna připojení k internetu:
- 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šší.
- Pro všechny certifikáty musí být použita alespoň otisk prstu SHA256 s klíčem RSA o 2048bitovém nebo vyšším nebo 256bitovém nebo vyšším klíči Elliptic-Curve (ECC).
Vzhledem k tomu, že je ATS ve výchozím nastavení v iOSu 9 povolená, všechny pokusy o vytvoření připojení, které nesplňuje tyto požadavky, způsobí vyvolání výjimky.
Šifry kompatibilní se službou ATS
Pro zabezpečenou internetovou komunikaci atS přijímá následující typ šifrování šifry předávání:
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 najdete v referenční dokumentaci ke třídě NSURL Připojení ion společnosti Apple nebo referenční dokumentace ke třídě NSURLSession.
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 se vaše aplikace Xamarin.iOS nebo jakákoli knihovna nebo služba, kterou používá, vytvoří připojení k internetu, budete muset provést nějakou akci nebo vaše připojení způsobí vyvolání výjimky.
Pro existující aplikaci Apple navrhuje, abyste protokol co nejdříve podporovali HTTPS
. 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 se z 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 docházet 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 částech s požadavky na Připojení ion ATS a šifry kompatibilní se službou ATS.
I když možná neznáte protokol TLS (Transport Layer Security), je to následník 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 používáte, a proto je mimo kontrolu aplikace. HttpClient
ModernHttpClient
Šifrování TLS podporované serverem by mělo automaticky používat nejvyšší úroveň šifrování TLS.
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ávání tajemství nebo vybrat nižší úroveň protokolu TLS. Další podrobnosti najdete v části Konfigurace možností ATS níže.
Důležité
Zabezpečení přenosu aplikací se nevztahuje na aplikace Xamarin využívající spravované implementace HTTPClient. Platí pouze pro připojení využívající implementace CFNetwork HTTPClient nebo implementace NSURLSession HTTPClient.
Nastavení implementace HTTPClient
Pokud chcete nastavit implementaci HTTPClient používanou aplikací pro iOS, poklikejte na Projekt v Průzkumník řešení a otevřete možnosti projektu. V rozevíracím seznamu implementace HttpClient přejděte na build iOS a vyberte požadovaný typ klienta:
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 rozhraním 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.
CfNetwork – obslužná rutina
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 pro 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ů se službou 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.com
cleartext), protože je nezabezpečené. Dočasné výjimky je možné nakonfigurovat prostřednictvím souboru Info.plist vaší aplikace.
V systému iOS9 vynucuje služba 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ě k šifrování pomocí protokolu TLS verze 1.2 s předáváním tajemství.
Vzhledem k tomu, že služba 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í NSURLConnection
nebo CFURL
NSURLSession
budou podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tento požadavek, dojde k selhání 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 bylo možné zobrazit, 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
) – PokudYES
bude ATS zakázána pro žádnou doménu , která není uvedená vNSExceptionDomains
seznamu . Pro uvedené domény se použijí zadaná nastavení zabezpečení. - NSAllowsArbitraryLoadsInWebContent (
Boolean
) – PokudYES
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 používá pro danou doménu. - <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 neboTLSv1.0
TLSv1.1
TLSv1.2
(což je výchozí hodnota). - NSExceptionRequiresForwardSecrecy (
Boolean
) – PokudNO
doména nemusí používat šifru s předáváním zabezpečení. Výchozí hodnota jeYES
. - NSExceptionAllowsInsecureHTTPLoads (
Boolean
) – PokudNO
(výchozí) veškerá komunikace s touto doménou musí být vHTTPS
protokolu. - NSRequiresCertificateTransparency () – Pokud
YES
protokol SSL (Boolean
Secure Sockets Layer) domény musí obsahovat platná data transparentnosti. Výchozí hodnota jeNO
. - NSIncludesSubdomains (
Boolean
) – PokudYES
tato nastavení přepíší všechny subdomény této domény. Výchozí hodnota jeNO
. - NSThirdPartyExceptionMinimumTLSVersion (
String
) – verze PROTOKOLU TLS použitá v případech, kdy je doména služba třetí strany mimo kontrolu vývojáře. - NSThirdPartyExceptionRequiresForwardSecrecy (
Boolean
) – PokudYES
doména třetí strany vyžaduje předání tajemství. - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) – PokudYES
ATS povolí nezabezpečenou komunikaci s doménami třetích stran.
Odhlášení z ATS
I když Společnost Apple důrazně navrhuje používat HTTPS
protokol a zabezpečenou komunikaci s internetovými informacemi, někdy to nemusí být vždy možné. Pokud například komunikujete s webovou službou třetí strany nebo používáte reklamy doručené přes internet ve vaší aplikaci.
Pokud vaše aplikace Xamarin.iOS musí provést požadavek na nezabezpečenou doménu, následující změny souboru Info.plist vaší aplikace zakáže výchozí nastavení zabezpečení, které ATS vynucuje pro danou doménu:
<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:
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 ochrana Apple Transport Security (ATS) je stále povolená pro zbytek aplikace:
<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:
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, NSExceptionDomains
a ne úplně vypnout ATS pomocí NSAllowsArbitraryLoads
. NSAllowsArbitraryLoads
by měla být použita pouze v extrémních nouzových situacích.
Opět platí, že zakázání ATS by se mělo používat jenom jako poslední možnost, pokud je přepnutí na zabezpečená připojení nedostupná nebo nepraktická.
Shrnutí
Tento článek představil službu 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 probrali řízení funkcí a možností ATS. Nakonec jsme probrali výslovný nesouhlas s ATS ve vaší aplikaci Xamarin.iOS.