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ę:
- Kliknij dwukrotnie nazwę projektu w Eksplorator rozwiązań, aby otworzyć opcje projektu.
- Przejdź do ustawień kompilacji dla projektu (na przykład kompilacja systemu iOS dla aplikacji platformy Xamarin.iOS).
- Z listy rozwijanej Implementacja klienta HttpClient wybierz
HttpClient
typ jako jeden z następujących: NSUrlSession (zalecane), CFNetwork lub Managed.
Napiwek
W przypadku protokołu TLS 1.2 zalecana NSUrlSession
jest opcja .
NSUrlSession
Program NSURLSession
obsł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 CFNetwork
obsł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 NSUrlConnection
CFUrl
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:
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>