Selektor implementacji httpClient i SSL/TLS dla systemu iOS/macOS

Selektor implementacji HttpClient dla platform Xamarin.iOS, Xamarin.tvOS i Xamarin.Mac steruje HttpClient implementacją do użycia. Możesz przełączyć się na implementację korzystającą z transportu natywnego systemu iOS, tvOS lub macOS (NSUrlSession lub CFNetwork, w zależności od systemu operacyjnego). Plusem jest obsługa protokołu TLS 1.2, mniejsze pliki binarne i szybsze pobieranie; Wadą jest to, że wymaga uruchomienia pętli zdarzeń, aby wykonać operacje asynchroniczne.

Projekty muszą odwoływać się do zestawu System.Net.Http .

Ostrzeżenie

Kwiecień 2018 r. — ze względu na zwiększone wymagania dotyczące zabezpieczeń, w tym zgodność ze standardem PCI, oczekuje się, że główni dostawcy usług w chmurze i serwery internetowe przestaną obsługiwać wersje protokołu TLS starsze niż 1.2. Projekty Xamarin utworzone w poprzednich wersjach programu Visual Studio domyślnie używają starszych wersji protokołu TLS.

Aby upewnić się, że aplikacje będą nadal działać z tymi serwerami i usługami, należy zaktualizować projekty platformy Xamarin przy użyciu poniższego NSUrlSession ustawienia, a następnie ponownie skompilować i ponownie wdrożyć aplikacje dla użytkowników.

Wybieranie stosu HttpClient

Aby dostosować HttpClient używany przez aplikację:

  1. Kliknij dwukrotnie nazwę projektu w Eksplorator rozwiązań, aby otworzyć opcje projektu.
  2. Przejdź do ustawień kompilacji dla projektu (na przykład kompilacja systemu iOS dla aplikacji platformy Xamarin.iOS).
  3. Z listy rozwijanej Implementacja klienta HttpClient wybierz HttpClient typ jako jeden z następujących: NSUrlSession (zalecane), CFNetwork lub Managed.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Napiwek

W przypadku protokołu TLS 1.2 zalecana NSUrlSession jest opcja .

NSUrlSession

Program NSURLSessionobsługi oparty na protokole jest oparty na natywnej NSURLSession strukturze dostępnej w systemie iOS 7 i nowszych. Jest to zalecane ustawienie.

Plusy

  • Używa ona natywnych interfejsów API w celu uzyskania lepszej wydajności i mniejszego rozmiaru pliku wykonywalnego.
  • Obsługa najnowszych standardów, takich jak TLS 1.2.

Minusy

  • Wymaga systemu iOS 7 lub nowszego.
  • Niektóre HttpClient funkcje/opcje nie są dostępne.

CfNetwork

Program CFNetworkobsługi oparty na systemie jest oparty na natywnej CFNetwork strukturze dostępnej w systemie iOS 6 i nowszych.

Plusy

  • Używa ona natywnych interfejsów API w celu uzyskania lepszej wydajności i mniejszego rozmiaru pliku wykonywalnego.
  • Obsługa nowszych standardów, takich jak TLS 1.2.

Minusy

  • Wymaga systemu iOS 6 lub nowszego.
  • Niedostępne w systemie watchOS.
  • Niektóre funkcje/opcje klienta HttpClient nie są dostępne.

Zarządzana

Program obsługi zarządzanej to w pełni zarządzana procedura obsługi HttpClient, która została dostarczona z poprzednią wersją platformy Xamarin.

Plusy

  • Ma najbardziej zgodny zestaw funkcji z platformą Microsoft .NET i starszymi wersjami platformy Xamarin.

Minusy

  • Nie jest w pełni zintegrowany z systemami operacyjnymi firmy Apple i jest ograniczony do protokołu TLS 1.0. W przyszłości może nie być możliwe nawiązanie połączenia z bezpiecznymi serwerami internetowymi lub usługami w chmurze.
  • Zwykle znacznie wolniejsze jest szyfrowanie niż natywne interfejsy API.
  • Wymaga to bardziej zarządzanego kodu, co powoduje utworzenie większej dystrybucji aplikacji.

Programowe ustawianie programu HttpMessageHandler

Oprócz powyższej konfiguracji dla całego projektu można również utworzyć wystąpienie HttpClient elementu i wstrzyknąć żądany HttpMessageHandler za pomocą konstruktora, jak pokazano w poniższych fragmentach kodu:

// 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());

Dzięki temu można użyć innej HttpMessageHandler opcji niż zadeklarowana w oknie dialogowym Opcje projektu.

Implementacja protokołu SSL/TLS

Protokół SSL (Secure Socket Layer) i jego następca, TLS (Transport Layer Security), zapewniają obsługę protokołu HTTP i innych połączeń sieciowych za pośrednictwem usługi System.Net.Security.SslStream. Implementacja platformy Xamarin.iOS, Xamarin.tvOS lub Xamarin.Mac System.Net.Security.SslStream wywoła natywną implementację protokołu SSL/TLS firmy Apple zamiast korzystać z implementacji zarządzanej dostarczonej przez platformę Mono. Natywna implementacja firmy Apple obsługuje protokół TLS 1.2.

Ostrzeżenie

Nadchodząca wersja platformy Xamarin.Mac 4.8 będzie obsługiwała tylko system macOS w wersji 10.9 lub wyższej. Poprzednie wersje platformy Xamarin.Mac obsługiwały system macOS w wersji 10.7 lub wyższej, ale starsze wersje systemu macOS nie posiadają odpowiedniej infrastruktury TLS do obsługi protokołu TLS 1.2. W przypadku systemu macOS 10.7 lub macOS 10.8 należy użyć platformy Xamarin.Mac w wersji 4.6 lub wcześniejszej.

Zabezpieczenia transportu aplikacji

Usługa App Transport Security (ATS) firmy Apple wymusza bezpieczne połączenia między zasobami internetowymi (takimi jak serwer zaplecza aplikacji) i aplikacją. Usługa ATS zapewnia, że cała komunikacja internetowa jest zgodna z najlepszymi rozwiązaniami dotyczącymi bezpiecznego połączenia, zapobiegając przypadkowemu ujawnieniu poufnych informacji bezpośrednio za pośrednictwem aplikacji lub biblioteki, z którą korzysta.

Ponieważ usługa ATS jest domyślnie włączona w aplikacjach utworzonych dla systemów iOS 9, tvOS 9 i OS X 10.11 (El Capitan) i nowszych, wszystkie połączenia korzystające z systemu NSUrlConnectionCFUrl lub NSUrlSession będą objęte wymaganiami dotyczącymi zabezpieczeń usługi ATS. Jeśli połączenia nie spełniają tych wymagań, nie powiedzą się z wyjątkiem.

Na podstawie wybranych opcji Implementacja stosu HttpClient i protokołu SSL/TLS może być konieczne wprowadzenie modyfikacji aplikacji w celu poprawnej pracy z usługą ATS.

Aby dowiedzieć się więcej o usłudze ATS, zobacz nasz przewodnik po usłudze App Transport Security.

Znane problemy

W tej sekcji omówiono znane problemy z obsługą protokołu TLS na platformie Xamarin.iOS.

Nie można załadować projektu z powodu błędu "Nie znaleziono żądanej wartości AppleTLS"

Środowisko Xamarin.iOS 9.8 wprowadziło niektóre nowe ustawienia zawarte w pliku csproj dla aplikacji platformy Xamarin.iOS. Te zmiany mogą powodować problemy podczas otwierania projektu ze starszymi wersjami platformy Xamarin.iOS. Poniższy zrzut ekranu to przykład komunikatu o błędzie, który może być wyświetlany w tym scenariuszu:

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

Ten błąd jest spowodowany wprowadzeniem MtouchTlsProvider ustawienia do pliku projektu na platformie Xamarin.iOS 9.8. Jeśli nie można zaktualizować do wersji Xamarin.iOS 9.8 (lub nowszej), obejście polega na ręcznej edycji aplikacji pliku csproj , usunięciu MtouchTlsprovider elementu, a następnie zapisaniu zmienionego pliku projektu.

Poniższy fragment kodu to przykład tego, jak MtouchTlsProvider ustawienie może wyglądać wewnątrz pliku csproj :

<MtouchTlsProvider>Default</MtouchTlsProvider>