Selektor implementace HttpClient a SSL/TLS pro iOS/macOS

Výběr implementace HttpClient pro Xamarin.iOS, Xamarin.tvOS a Xamarin.Mac řídí, kterou HttpClient implementaci použít. Můžete přepnout na implementaci, která používá nativní přenosy pro iOS, tvOS nebo macOS (NSUrlSession nebo CFNetworkv závislosti na operačním systému). Nevýhodou je podpora protokolu TLS 1.2, menší binární soubory a rychlejší stahování; Nevýhodou je, že vyžaduje, aby byla spuštěna smyčka událostí, aby se spustily asynchronní operace.

Projekty musí odkazovat na sestavení System.Net.Http .

Upozorňující

Duben 2018 – Kvůli zvýšeným požadavkům na zabezpečení, včetně dodržování předpisů PCI, očekává se, že hlavní poskytovatelé cloudu a webové servery přestanou podporovat verze TLS starší než 1.2. Projekty Xamarin vytvořené v předchozích verzích sady Visual Studio ve výchozím nastavení používají starší verze protokolu TLS.

Abyste měli jistotu, že vaše aplikace budou dál fungovat s těmito servery a službami, měli byste projekty Xamarin aktualizovat nastavením NSUrlSession uvedeným níže a pak znovu sestavovat a nasazovat aplikace uživatelům.

Výběr zásobníku HttpClient

Úprava HttpClient používané vaší aplikací:

  1. Poklikáním na název projektu v Průzkumník řešení otevřete možnosti projektu.
  2. Přepněte do nastavení sestavení pro váš projekt (například sestavení pro iOS pro aplikaci Xamarin.iOS).
  3. V rozevíracím seznamu Implementace HttpClient vyberte HttpClient typ jako jeden z následujících: NSUrlSession (doporučeno), CFNetwork nebo Managed.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Tip

Pro protokol NSUrlSession TLS 1.2 se doporučuje tato možnost.

NSUrlsession

Obslužná rutina NSURLSessionzaložená na nativním NSURLSession rozhraní dostupném v iOSu 7 a novějším. Toto je doporučené nastavení.

Výhody

  • Používá nativní rozhraní API pro lepší výkon a menší velikost spustitelného souboru.
  • Podpora nejnovějších standardů, jako je TLS 1.2.

Nevýhody

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

CFNetwork

Obslužná rutina CFNetworkzaložená na nativním CFNetwork rozhraní dostupném v iOSu 6 a novějším.

Výhody

  • Používá nativní rozhraní API pro lepší výkon a menší velikost spustitelného souboru.
  • Podpora novějších standardů, jako je TLS 1.2.

Nevýhody

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

Spravované

Spravovaná obslužná rutina je plně spravovaná obslužná rutina HttpClient, která byla dodána s předchozí verzí Xamarinu.

Výhody

  • Obsahuje sadu kompatibilních funkcí s microsoft .NET a staršími verzemi Xamarinu.

Nevýhody

  • Není plně integrovaná s operačním systémem Apple a je omezená na protokol TLS 1.0. V budoucnu se možná nebude moct připojit k zabezpečeným webovým serverům nebo cloudovým službám.
  • Obvykle je mnohem pomalejší u věcí, jako je šifrování, než nativní rozhraní API.
  • Vyžaduje více spravovaného kódu, čímž se vytvoří větší distribuovatelná aplikace.

Programové nastavení obslužné rutiny HttpMessage

Kromě výše uvedené konfigurace pro celý projekt můžete také vytvořit instanci HttpClient a vložit požadovaný HttpMessageHandler objekt prostřednictvím konstruktoru, jak je znázorněno v těchto fragmentech kódu:

// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();

// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());

// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());

To umožňuje použít jiný HttpMessageHandler způsob, než je deklarován v dialogovém okně Možnosti projektu.

Implementace PROTOKOLU SSL/TLS

SSL (Secure Socket Layer) a jeho následník, TLS (Transport Layer Security), poskytuje podporu protokolu HTTP a dalších síťových připojení prostřednictvím System.Net.Security.SslStream. Implementace Xamarin.iOS, Xamarin.tvOS nebo Xamarin.Mac System.Net.Security.SslStream bude místo použití spravované implementace poskytované Mono volat nativní implementaci SSL/TLS společnosti Apple. Nativní implementace společnosti Apple podporuje protokol TLS 1.2.

Upozorňující

Nadcházející verze Xamarin.Mac 4.8 bude podporovat jen macOS 10.9 nebo novější. Předchozí verze Xamarin.Mac podporují macOS 10.7 nebo vyšší, ale tyto starší verze macOS nemají dostatečnou infrastrukturu TLS pro podporu protokolu TLS 1.2. Pokud je cílem macOS 10.7 nebo macOS 10.8, použijte Xamarin.Mac 4.6 nebo starší.

Zabezpečení přenosu aplikací

Apple App Transport Security (ATS) vynucuje zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a vaší aplikací. ATS zajišťuje, aby veškerá internetová komunikace odpovídala osvědčeným postupům zabezpečeného připojení, a tím zabránila náhodnému zveřejnění citlivých informací přímo prostřednictvím vaší aplikace nebo knihovny, kterou využívá.

Vzhledem k tomu, že ats je ve výchozím nastavení povolená v aplikacích vytvořených pro iOS 9, tvOS 9 a OS X 10.11 (El Capitan) a novějších, všechna připojení používající NSUrlConnectionnebo CFUrlNSUrlSession budou podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tyto požadavky, dojde k selhání s výjimkou.

Na základě výběru implementace httpClient Stack a SSL/TLS možná budete muset provést změny aplikace, aby správně fungovala se službou ATS.

Další informace o ATS najdete v našem průvodci službou App Transport Security.

Známé problémy

Tato část se zabývá známými problémy s podporou protokolu TLS v Xamarin.iOS.

Project se nepovedlo načíst s chybou "Požadovaná hodnota AppleTLS nebyla nalezena"

Xamarin.iOS 9.8 zavedl některá nová nastavení, která obsahovala soubor .csproj pro aplikaci Xamarin.iOS. Tyto změny můžou způsobit problémy při otevření projektu ve starších verzích Xamarin.iOS. Následující snímek obrazovky je příkladem chybové zprávy, která se může zobrazit v tomto scénáři:

Screenshot of error while trying to load project, requested value legacy not found

Tato chyba je způsobena zavedením MtouchTlsProvider nastavení souboru projektu v Xamarin.iOS 9.8. Pokud není možné aktualizovat na Xamarin.iOS 9.8 (nebo vyšší), je alternativním řešením ručně upravit souborovou aplikaci .csproj , odebrat MtouchTlsprovider prvek a potom uložit změněný soubor projektu.

Následující fragment kódu je příkladem toho, jak MtouchTlsProvider může nastavení vypadat uvnitř souboru .csproj :

<MtouchTlsProvider>Default</MtouchTlsProvider>