HttpClient Stack und SSL/TLS-Implementierungsauswahl für Android

Die Selektoren HttpClient Stack und SSL/TLS-Implementierung bestimmen die HttpClient- und SSL/TLS-Implementierung, die von Ihren Xamarin.Android-Apps verwendet werden.

Projekte müssen auf die Assembly System.Net.Http verweisen.

Warnung

April 2018 – Aufgrund erhöhter Sicherheitsanforderungen, einschließlich PCI-Compliance, wird erwartet, dass die wichtigsten Cloudanbieter und Webserver tls-Versionen, die älter als 1.2 sind, nicht mehr unterstützen. Xamarin-Projekte, die in früheren Versionen von Visual Studio erstellt wurden, verwenden standardmäßig ältere Versionen von TLS.

Um sicherzustellen, dass Ihre Apps weiterhin mit diesen Servern und Diensten funktionieren, sollten Sie Ihre Xamarin-Projekte mit den Android HttpClient unten gezeigten Einstellungen und Native TLS 1.2 aktualisieren und dann Ihre Apps neu erstellen und für Ihre Benutzer neu bereitstellen.

Die Xamarin.Android HttpClient-Konfiguration befindet sich unter Projektoptionen > Android-Optionen, und klicken Sie dann auf die Schaltfläche Erweiterte Optionen .

Dies sind die empfohlenen Einstellungen für TLS 1.2-Unterstützung:

Visual Studio Android-Optionen

Alternative Konfigurationsoptionen

AndroidClientHandler

AndroidClientHandler ist der neue Handler, der nativen Java/OS-Code delegiert, anstatt alles in verwaltetem Code zu implementieren. Dies ist die empfohlene Option.

Vorteile

  • Verwenden Sie die native API, um die Leistung zu verbessern und die größe der ausführbaren Dateien zu verkleineren.
  • Unterstützung für die neuesten Standards, z. B. TLS 1.2.

Nachteile

  • Erfordert Android 4.1 oder höher.
  • Einige HttpClient-Features/Optionen sind nicht verfügbar.

Verwaltet (HttpClientHandler)

Der verwaltete Handler ist der vollständig verwaltete HttpClient-Handler, der mit früheren Xamarin.Android-Versionen ausgeliefert wurde.

Vorteile

  • Es ist die am besten kompatiblen (Features) mit MS .NET und älteren Xamarin-Versionen.

Nachteile

  • Es ist nicht vollständig in das Betriebssystem integriert (z. B. beschränkt auf TLS 1.0).
  • Es ist in der Regel viel langsamer (z. B. Verschlüsselung) als die native API.
  • Es erfordert mehr verwalteten Code, wodurch größere Anwendungen erstellt werden.

Auswählen eines Handlers

Die Wahl zwischen AndroidClientHandler und HttpClientHandler hängt von den Anforderungen Ihrer Anwendung ab. AndroidClientHandler wird für den aktuellsten Sicherheitssupport empfohlen, z. B.

  • Sie benötigen TLS 1.2+ Unterstützung.
  • Ihre App ist für Android 4.1 (API 16) oder höher ausgerichtet.
  • Sie benötigen TLS 1.2+ Unterstützung für HttpClient.
  • Sie benötigen keine TLS 1.2+ Unterstützung für WebClient.

HttpClientHandler ist eine gute Wahl, wenn Sie TLS 1.2+ Unterstützung benötigen, aber Versionen von Android vor Android 4.1 unterstützen müssen. Es ist auch eine gute Wahl, wenn Sie TLS 1.2+ Unterstützung für WebClientbenötigen.

Ab Xamarin.Android 8.3 wird HttpClientHandler standardmäßig Boring SSL (btls) als zugrunde liegender TLS-Anbieter verwendet. Der Boring SSL TLS-Anbieter bietet die folgenden Vorteile:

  • Es unterstützt TLS 1.2 und höher.
  • Es werden alle Android-Versionen unterstützt.
  • Es bietet TLS 1.2+ Unterstützung für und HttpClientWebClient.

Der Nachteil der Verwendung von Boring SSL als untergeordnetem TLS-Anbieter ist, dass die Größe des resultierenden APK erhöht werden kann (es fügt etwa 1 MB zusätzliche APK-Größe pro unterstützter ABI hinzu).

Ab Xamarin.Android 8.3 ist der TLS-Standardanbieter Boring SSL (btls). Wenn Sie boring SSL nicht verwenden möchten, können Sie rückgängig machen zur historischen verwalteten SSL-Implementierung, indem Sie die $(AndroidTlsProvider) -Eigenschaft auf legacy festlegen (weitere Informationen zum Festlegen von Buildeigenschaften finden Sie unter Buildprozess).

Programmgesteuerte Verwendung AndroidClientHandler

Das Xamarin.Android.Net.AndroidClientHandler ist eine HttpMessageHandler Implementierung speziell für Xamarin.Android. Instanzen dieser Klasse verwenden die native java.net.URLConnection Implementierung für alle HTTP-Verbindungen. Dies sorgt theoretisch für eine Steigerung der HTTP-Leistung und kleinere APK-Größen.

Dieser Codeausschnitt ist ein Beispiel für die explizite Verwendung eines einzelnen instance der HttpClient -Klasse:

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

Hinweis

Das zugrunde liegende Android-Gerät muss TLS 1.2 (dh. Android 4.1 und höher). Bitte beachten Sie, dass die offizielle Unterstützung für TLS 1.2 in Android 5.0 und höher ist. Einige Geräte unterstützen jedoch TLS 1.2 in Android 4.1 und höher.

Buildoption für die SSL/TLS-Implementierung

Diese Projektoption steuert, welche zugrunde liegende TLS-Bibliothek von allen Webanforderungen verwendet wird, sowohl als auch HttpClientWebRequest. Standardmäßig ist TLS 1.2 ausgewählt:

Beispiel:

var client = new HttpClient();

Wenn die HttpClient-Implementierung auf Verwaltet und die TLS-Implementierung auf Native TLS 1.2+ festgelegt wurde, verwendet das client Objekt automatisch die verwaltete HttpClientHandler und TLS 1.2 (von der BoringSSL-Bibliothek bereitgestellt) für seine HTTP-Anforderungen.

Wenn die HttpClient-Implementierung jedoch auf AndroidHttpClientfestgelegt ist, verwenden alle HttpClient Objekte die zugrunde liegende Java-Klasse java.net.URLConnection und sind vom TLS/SSL-Implementierungswert nicht betroffen. WebRequest -Objekte würden die BoringSSL-Bibliothek verwenden.

Andere Möglichkeiten zum Steuern der SSL/TLS-Konfiguration

Es gibt drei Möglichkeiten, wie eine Xamarin.Android-Anwendung die TLS-Einstellungen steuern kann:

  1. Wählen Sie die HttpClient-Implementierung und die TLS-Standardbibliothek in den Projektoptionen aus.
  2. Programmgesteuerte Verwendung von Xamarin.Android.Net.AndroidClientHandler.
  3. Deklarieren Sie Umgebungsvariablen (optional).

Von den drei Optionen wird empfohlen, die Xamarin.Android-Projektoptionen zu verwenden, um den Standardwert HttpMessageHandler und TLS für die gesamte App zu deklarieren. Anschließend instanziieren Xamarin.Android.Net.AndroidClientHandler Sie objekte bei Bedarf programmgesteuert. Diese Optionen werden oben beschrieben.

Die dritte Option – die Verwendung von Umgebungsvariablen – wird unten erläutert.

Deklarieren von Umgebungsvariablen

Es gibt zwei Umgebungsvariablen, die sich auf die Verwendung von TLS in Xamarin.Android beziehen:

  • XA_HTTP_CLIENT_HANDLER_TYPE – Diese Umgebungsvariable deklariert den Standardwert HttpMessageHandler , den die Anwendung verwendet. Beispiel:

    XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
    
  • XA_TLS_PROVIDER – Diese Umgebungsvariable deklariert, welche TLS-Bibliothek verwendet wird, entweder btls, legacyoder default (was mit dem Weglassen dieser Variablen identisch ist):

    XA_TLS_PROVIDER=btls
    

Diese Umgebungsvariable wird festgelegt, indem dem Projekt eine Umgebungsdatei hinzugefügt wird. Eine Umgebungsdatei ist eine Unix-formatierte Nur-Text-Datei mit einer Buildaktion von AndroidEnvironment:

Weitere Informationen zu Umgebungsvariablen und Xamarin.Android finden Sie im Leitfaden zur Xamarin.Android-Umgebung .