Selektor implementacji httpClient Stack i SSL/TLS dla systemu Android

Selektory implementacji stosu HttpClient i protokołu SSL/TLS określają implementację protokołu HttpClient i SSL/TLS, która będzie używana przez aplikacje platformy Xamarin.Android.

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 zapewnić kontynuowanie pracy aplikacji z tymi serwerami i usługami, należy zaktualizować projekty platformy Xamarin przy Android HttpClient użyciu poniższych ustawień i Native TLS 1.2 , a następnie ponownie skompilować i ponownie wdrożyć aplikacje dla użytkowników.

Konfiguracja Xamarin.Android HttpClient znajduje się w obszarze Opcje projektu Opcje> systemu Android, a następnie kliknij przycisk Opcje zaawansowane.

Są to zalecane ustawienia obsługi protokołu TLS 1.2:

Visual Studio Android Options

Alternatywne opcje konfiguracji

AndroidClientHandler

AndroidClientHandler to nowa procedura obsługi, która deleguje do natywnego kodu Java/OS zamiast implementowania wszystkiego w kodzie zarządzanym. Jest to zalecana opcja.

Plusy

  • Użyj natywnego interfejsu API, aby uzyskać lepszą wydajność i mniejszy rozmiar pliku wykonywalnego.
  • Obsługa najnowszych standardów, np. TLS 1.2.

Minusy

  • Wymaga systemu Android 4.1 lub nowszego.
  • Niektóre funkcje/opcje klienta HttpClient nie są dostępne.

Zarządzane (HttpClientHandler)

Program obsługi zarządzanej to w pełni zarządzana procedura obsługi httpClient, która została dostarczona z poprzednimi wersjami platformy Xamarin.Android.

Plusy

  • Jest to najbardziej zgodna (funkcje) z platformą MS .NET i starszymi wersjami platformy Xamarin.

Minusy

  • Nie jest w pełni zintegrowany z systemem operacyjnym (np. ograniczony do protokołu TLS 1.0).
  • Zwykle jest to znacznie wolniejsze (np. szyfrowanie) niż natywny interfejs API.
  • Wymaga to bardziej zarządzanego kodu, tworząc większe aplikacje.

Wybieranie programu obsługi

Wybór między elementami AndroidClientHandler i HttpClientHandler zależy od potrzeb aplikacji. AndroidClientHandler jest zalecana w przypadku najbardziej aktualnej obsługi zabezpieczeń, np.

  • Wymagana jest obsługa protokołu TLS 1.2 lub nowszego.
  • Aplikacja jest przeznaczona dla systemu Android 4.1 (interfejs API 16) lub nowszego.
  • Potrzebujesz obsługi protokołu TLS 1.2 lub nowszego dla programu HttpClient.
  • Nie potrzebujesz obsługi protokołu TLS 1.2 lub nowszego dla programu WebClient.

HttpClientHandler jest dobrym wyborem, jeśli potrzebujesz obsługi protokołu TLS 1.2 lub nowszego, ale musi obsługiwać wersje systemu Android starsze niż Android 4.1. Jest to również dobry wybór, jeśli potrzebujesz obsługi protokołu TLS 1.2+ dla programu WebClient.

Począwszy od platformy Xamarin.Android 8.3, HttpClientHandler wartość domyślna to Boring SSL (btls) jako podstawowy dostawca protokołu TLS. Dostawca boring SSL TLS oferuje następujące korzyści:

  • Obsługuje protokół TLS 1.2 lub nowszy.
  • Obsługuje wszystkie wersje systemu Android.
  • Zapewnia obsługę protokołu TLS 1.2+ dla obu HttpClient systemów i WebClient.

Wadą korzystania z protokołu Boring SSL jako niepełnego dostawcy protokołu TLS jest to, że może zwiększyć rozmiar wynikowego pakietu APK (dodaje około 1 MB dodatkowego rozmiaru apk na obsługiwany ABI).

Począwszy od platformy Xamarin.Android 8.3, domyślnym dostawcą protokołu TLS jest Boring SSL (btls). Jeśli nie chcesz używać protokołu Boring SSL, możesz przywrócić historyczną implementację zarządzanego protokołu SSL, ustawiając $(AndroidTlsProvider) właściwość na legacy (aby uzyskać więcej informacji na temat ustawiania właściwości kompilacji, zobacz Proces kompilacji).

Programowe używanie AndroidClientHandler

Jest Xamarin.Android.Net.AndroidClientHandler to implementacja przeznaczona HttpMessageHandler specjalnie dla platformy Xamarin.Android. Wystąpienia tej klasy będą używać natywnej java.net.URLConnection implementacji dla wszystkich połączeń HTTP. Teoretycznie zapewni to wzrost wydajności http i mniejszych rozmiarów apk.

Ten fragment kodu jest przykładem jawnego sposobu jawnego dla pojedynczego HttpClient wystąpienia klasy:

// Android 4.1 or higher, Xamarin.Android 6.1 or higher
HttpClient client = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler ());

Uwaga

Podstawowe urządzenie z systemem Android musi obsługiwać protokół TLS 1.2 (tj. System Android 4.1 lub nowszy). Należy pamiętać, że oficjalna obsługa protokołu TLS 1.2 jest w systemie Android 5.0 lub nowszym. Jednak niektóre urządzenia obsługują protokół TLS 1.2 w systemie Android 4.1 lub nowszym.

Opcja kompilacji implementacji protokołu SSL/TLS

Ta opcja projektu określa, jaka podstawowa biblioteka TLS będzie używana przez wszystkie żądania internetowe, zarówno, jak HttpClient i WebRequest. Domyślnie wybrano protokół TLS 1.2:

Na przykład:

var client = new HttpClient();

Jeśli implementacja httpClient została ustawiona na Wartość Zarządzana , a implementacja protokołu TLS została ustawiona na natywny protokół TLS 1.2 lub nowszy, client obiekt automatycznie będzie używał zarządzanych HttpClientHandler i TLS 1.2 (dostarczonych przez bibliotekę BoringSSL) dla żądań HTTP.

Jeśli jednak implementacja httpClient jest ustawiona na AndroidHttpClientwartość , wszystkie HttpClient obiekty będą używać bazowej klasy java.net.URLConnection Java i nie będą miały wpływu na wartość implementacji PROTOKOŁU TLS/SSL. WebRequest obiekty używają biblioteki BoringSSL.

Inne sposoby kontrolowania konfiguracji protokołu SSL/TLS

Istnieją trzy sposoby kontrolowania ustawień protokołu TLS przez aplikację platformy Xamarin.Android:

  1. Wybierz implementację HttpClient i domyślną bibliotekę PROTOKOŁU TLS w obszarze Opcje projektu.
  2. Programowo przy użyciu polecenia Xamarin.Android.Net.AndroidClientHandler.
  3. Zadeklaruj zmienne środowiskowe (opcjonalnie).

Spośród trzech opcji zalecanym rozwiązaniem jest użycie opcji projektu Xamarin.Android w celu zadeklarowania wartości domyślnej HttpMessageHandler i protokołu TLS dla całej aplikacji. Następnie, w razie potrzeby, programowe tworzenie wystąpień Xamarin.Android.Net.AndroidClientHandler obiektów. Te opcje zostały opisane powyżej.

Trzecia opcja — przy użyciu zmiennych środowiskowych — wyjaśniono poniżej.

Deklarowanie zmiennych środowiskowych

Istnieją dwie zmienne środowiskowe związane z używaniem protokołu TLS na platformie Xamarin.Android:

  • XA_HTTP_CLIENT_HANDLER_TYPE — ta zmienna środowiskowa deklaruje wartość domyślną HttpMessageHandler , która będzie używana przez aplikację. Na przykład:

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER — Ta zmienna środowiskowa deklaruje, która biblioteka TLS będzie używana, albo btls, legacylub default (która jest taka sama jak pominięcie tej zmiennej):

    XA_TLS_PROVIDER=btls
    

Ta zmienna środowiskowa jest ustawiana przez dodanie pliku środowiskowego do projektu. Plik środowiska to plik w formacie unix w postaci zwykłego tekstu z akcją kompilacji AndroidEnvironment:

Aby uzyskać więcej informacji na temat zmiennych środowiskowych i platformy Xamarin.Android, zobacz przewodnik środowiska Xamarin.Android .