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:
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 iWebClient
.
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 AndroidHttpClient
wartość , 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:
- Wybierz implementację HttpClient i domyślną bibliotekę PROTOKOŁU TLS w obszarze Opcje projektu.
- Programowo przy użyciu polecenia
Xamarin.Android.Net.AndroidClientHandler
. - 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, albobtls
,legacy
lubdefault
(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 .