HttpClient- und SSL/TLS-Implementierungsselektor für iOS/macOS

Die HttpClient-Implementierungsauswahl für Xamarin.iOS, Xamarin.tvOS und Xamarin.Mac steuert die zu verwendende HttpClient Implementierung. Sie können zu einer Implementierung wechseln, die native iOS-, tvOS- oder macOS-Transporte (NSUrlSession oder CFNetwork, abhängig vom Betriebssystem) verwendet. Der Vorteil ist TLS 1.2-Unterstützung, kleinere Binärdateien und schnellere Downloads. der Nachteil ist, dass die Ereignisschleife ausgeführt werden muss, damit asynchrone Vorgänge ausgeführt werden können.

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 der NSUrlSession unten gezeigten Einstellung aktualisieren und dann Ihre Apps neu erstellen und für Ihre Benutzer neu bereitstellen.

Auswählen eines HttpClient-Stapels

So passen Sie die HttpClient von Ihrer App verwendete An

  1. Doppelklicken Sie im Projektmappen-Explorer auf den Projektnamen, um die Projektoptionen zu öffnen.
  2. Wechseln Sie zu den Buildeinstellungen für Ihr Projekt (z. B. iOS-Build für eine Xamarin.iOS-App).
  3. Wählen Sie in der Dropdownliste HttpClient-Implementierung den HttpClient Typ wie folgt aus: NSUrlSession (empfohlen), CFNetwork oder Verwaltet.

Auswählen der HttpClient-Implementierung aus Managed, CFNetwork oder NSUrlSession

Tipp

Für TLS 1.2-Unterstützung wird die NSUrlSession Option empfohlen.

NSUrlSession

Der NSURLSession-basierte Handler basiert auf dem nativen NSURLSession Framework, das in iOS 7 und höher verfügbar ist. Dies ist die empfohlene Einstellung.

Vorteile

  • Es verwendet native APIs für eine bessere Leistung und kleinere ausführbare Dateien.
  • Unterstützung für die neuesten Standards wie TLS 1.2.

Nachteile

  • Erfordert iOS 7 oder höher.
  • Einige HttpClient Features/Optionen sind nicht verfügbar.

CFNetwork

Der CFNetwork-basierte Handler basiert auf dem nativen CFNetwork Framework, das in iOS 6 und höher verfügbar ist.

Vorteile

  • Es verwendet native APIs für eine bessere Leistung und kleinere ausführbare Dateien.
  • Unterstützung für neuere Standards wie TLS 1.2.

Nachteile

  • Erfordert iOS 6 oder höher.
  • Nicht unter watchOS verfügbar.
  • Einige HttpClient-Features/Optionen sind nicht verfügbar.

Verwaltet

Der verwaltete Handler ist der vollständig verwaltete HttpClient-Handler, der mit einer früheren Version von Xamarin ausgeliefert wurde.

Vorteile

  • Es verfügt über den am besten kompatiblen Featuresatz mit Microsoft .NET und älteren Xamarin-Versionen.

Nachteile

  • Es ist nicht vollständig in die Apple-Betriebssysteme integriert und auf TLS 1.0 beschränkt. Möglicherweise kann sie in Zukunft keine Verbindung mit sicheren Webservern oder Clouddiensten herstellen.
  • Es ist in der Regel viel langsamer bei Dingen wie Verschlüsselung als die nativen APIs.
  • Es erfordert mehr verwalteten Code, wodurch eine größere App verteilt werden kann.

Programmgesteuertes Festlegen des HttpMessageHandler

Zusätzlich zur oben gezeigten projektweiten Konfiguration können Sie auch eine HttpClient instanziieren und den gewünschten HttpMessageHandler über den Konstruktor einfügen, wie in den folgenden Codeausschnitten veranschaulicht:

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

Dies ermöglicht es, eine andere HttpMessageHandler als das zu verwenden, was im Dialogfeld Projektoptionen deklariert wird.

SSL/TLS-Implementierung

SSL (Secure Socket Layer) und sein Nachfolger TLS (Transport Layer Security) bieten Unterstützung für HTTP- und andere Netzwerkverbindungen über System.Net.Security.SslStream. Die Implementierung von Xamarin.iOS, Xamarin.tvOS oder Xamarin.Mac System.Net.Security.SslStream ruft die native SSL/TLS-Implementierung von Apple auf, anstatt die von Mono bereitgestellte verwaltete Implementierung zu verwenden. Die native Implementierung von Apple unterstützt TLS 1.2.

Warnung

Die anstehende Version Xamarin.Mac 4.8 unterstützt nur macOS 10.9 oder höher. Ältere Versionen von Xamarin.Mac unterstützen macOS 10.7 oder höher, aber diese älteren Versionen von MacOS verfügen nicht über ausreichende TLS-Infrastruktur zur Unterstützung von TLS 1.2. Für macOS 10.7 oder macOS 10.8 sollten Sie Xamarin.Mac 4.6 oder niedriger verwenden.

App-Transportsicherheit

Apples App Transport Security (ATS) erzwingt sichere Verbindungen zwischen Internetressourcen (z. B. dem Back-End-Server der App) und Ihrer App. ATS stellt sicher, dass die gesamte Internetkommunikation den bewährten Methoden für sichere Verbindungen entspricht, wodurch verhindert wird, dass vertrauliche Informationen entweder direkt über Ihre App oder eine Bibliothek, die sie nutzt, versehentlich offengelegt werden.

Da ATS standardmäßig in Apps aktiviert ist, die für iOS 9, tvOS 9 und OS X 10.11 (El Capitan) und neuer erstellt wurden, unterliegen alle Verbindungen, die oder verwenden NSUrlConnection, CFUrlNSUrlSession ATS-Sicherheitsanforderungen. Wenn Ihre Verbindungen diese Anforderungen nicht erfüllen, schlagen sie mit einer Ausnahme fehl.

Basierend auf Den Auswahlen für HttpClient Stack und SSL/TLS-Implementierung müssen Sie möglicherweise Änderungen an Ihrer App vornehmen, um ordnungsgemäß mit ATS zu arbeiten.

Weitere Informationen zu ATS finden Sie in unserem App Transport Security-Leitfaden.

Bekannte Probleme

In diesem Abschnitt werden bekannte Probleme mit der TLS-Unterstützung in Xamarin.iOS behandelt.

Fehler beim Laden des Projekts mit der Fehlermeldung "Angeforderter Wert AppleTLS wurde nicht gefunden"

Xamarin.iOS 9.8 hat einige neue Einstellungen eingeführt, die die CSPROJ-Datei für eine Xamarin.iOS-Anwendung enthalten. Diese Änderungen können Probleme verursachen, wenn das Projekt mit älteren Versionen von Xamarin.iOS geöffnet wird. Der folgende Screenshot ist ein Beispiel für die Fehlermeldung, die in diesem Szenario möglicherweise angezeigt wird:

Screenshot: Fehler beim Laden des Projekts, angeforderter Wert legacy nicht gefunden

Dieser Fehler wird durch die Einführung der MtouchTlsProvider Einstellung in die Projektdatei in Xamarin.iOS 9.8 verursacht. Wenn es nicht möglich ist, auf Xamarin.iOS 9.8 (oder höher) zu aktualisieren, besteht die Umgehung darin, die CSPROJ-Dateianwendung manuell zu bearbeiten, das MtouchTlsprovider Element zu entfernen und dann die geänderte Projektdatei zu speichern.

Der folgende Codeausschnitt ist ein Beispiel dafür, wie die MtouchTlsProvider Einstellung in einer CSPROJ-Datei aussehen kann:

<MtouchTlsProvider>Default</MtouchTlsProvider>