App Transport Security in Xamarin.iOS

App Transport Security (ATS) erzwingt sichere Verbindungen zwischen Internetressourcen (z. B. dem Back-End-Server der App) und Ihrer App.

In diesem Artikel werden die Sicherheitsänderungen vorgestellt, die App Transport Security für eine iOS 9-App erzwingt und was dies für Ihre Xamarin.iOS-Projekte bedeutet, es behandelt die ATS-Konfigurationsoptionen und behandelt, wie Sie ATS ATS bei Bedarf deaktivieren. Da ATS standardmäßig aktiviert ist, löst jede nicht sichere Internetverbindung eine Ausnahme in iOS 9-Apps aus (es sei denn, Sie haben sie explizit zugelassen).

Informationen zur App-Transportsicherheit

Wie oben erwähnt, stellt ATS sicher, dass alle Internetkommunikationen in iOS 9 und OS X El Capitan den bewährten Methoden für sichere Verbindungen entsprechen, wodurch die versehentliche Offenlegung vertraulicher Informationen entweder direkt über Ihre App oder eine Bibliothek verhindert wird, die sie verbraucht.

Implementieren Sie für vorhandene Apps das HTTPS Protokoll nach Möglichkeit. Bei neuen Xamarin.iOS-Apps sollten Sie ausschließlich bei der Kommunikation mit Internetressourcen verwenden HTTPS . Darüber hinaus muss die allgemeine API-Kommunikation mit TLS Version 1.2 mit Weiterleitungsgeheimnis verschlüsselt werden.

Jede Verbindung mit NSUrl Verbinden ion, CFUrl oder NSUrlSession verwendet ATS standardmäßig in Apps, die für iOS 9 und OS X 10.11 (El Capitan) erstellt wurden.

AtS-Standardverhalten

Da ATS standardmäßig in Apps aktiviert ist, die für iOS 9 und OS X 10.11 (El Capitan) erstellt wurden, werden alle Verbindungen, die NSUrlConnection, CFUrl oder NSUrlSession verwenden, den ATS-Sicherheitsanforderungen unterliegen. Wenn Ihre Verbindungen diese Anforderung nicht erfüllen, werden sie mit einer Ausnahme fehlschlagen.

ATS-Verbinden ion-Anforderungen

ATS erzwingt die folgenden Anforderungen für alle Internetverbindungen:

  • Alle Verbindungschiffre müssen die Weiterleitungsgeheimnise verwenden. Siehe die Liste der akzeptierten Verschlüsselungen unten.
  • Das TLS-Protokoll (Transport Layer Security) muss Version 1.2 oder höher sein.
  • Mindestens ein SHA256-Fingerabdruck mit einem RSA-Schlüssel (2048 Bit oder höher) oder einem 256-Bit- oder höherer ECC-Schlüssel (Elliptic-Curve) muss für alle Zertifikate verwendet werden.

Da ATS standardmäßig in iOS 9 aktiviert ist, führt jeder Versuch, eine Verbindung herzustellen, die diese Anforderungen nicht erfüllt, zu einer Ausnahme.

ATS-kompatible Verschlüsselungen

Die folgende Forward-Geheimhaltungschiffre wird von ATS gesicherter Internetkommunikation akzeptiert:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Weitere Informationen zum Arbeiten mit iOS-Internetkommunikationsklassen finden Sie in der NSURL Verbinden ion Class Reference oder NSURLSession Class Reference.

Unterstützung von ATS in Xamarin.iOS

Da ATS in iOS 9 und OS X El Capitan standardmäßig aktiviert ist, wenn Ihre Xamarin.iOS-App oder eine bibliothek oder ein Dienst, die sie verwendet, eine Verbindung mit dem Internet herstellen, müssen Sie eine Aktion ausführen, oder Ihre Verbindungen führen zu einer Ausnahme, die ausgelöst wird.

Für eine vorhandene App schlägt Apple vor, das HTTPS Protokoll so schnell wie möglich zu unterstützen. Wenn Sie entweder keine Verbindung mit einem Drittanbieterwebdienst herstellen, der nicht unterstützt HTTPS wird oder wenn die Unterstützung HTTPS unpraktisch wäre, können Sie ATS deaktivieren. Weitere Informationen finden Sie im Abschnitt "Opting-Out of ATS" weiter unten.

Bei einer neuen Xamarin.iOS-App sollten Sie ausschließlich bei der Kommunikation mit Internetressourcen verwenden HTTPS . Auch hier kann es Situationen geben (z. B. die Verwendung eines Drittanbieterwebdiensts), in denen dies nicht möglich ist, und Sie müssen atS deaktivieren.

Darüber hinaus erzwingt ATS eine allgemeine API-Kommunikation, die mit TLS Version 1.2 mit Weiterleitungsgeheimnis verschlüsselt wird. Weitere Informationen finden Sie in den Abschnitten ATS Verbinden ion Requirements and ATS Compatible Ciphers weiter oben.

Obwohl Sie möglicherweise nicht mit TLS (Transport Layer Security) vertraut sind, ist es der Nachfolger von SSL (Secure Socket Layer) und bietet eine Sammlung kryptografischer Protokolle, um Die Sicherheit über Netzwerkverbindungen zu erzwingen.

Die TLS-Ebene wird vom Webdienst gesteuert, den Sie verwenden, und liegt daher außerhalb der Kontrolle der App. Sowohl die HttpClient als auch die ModernHttpClient sollte automatisch die höchste Vom Server unterstützte TLS-Verschlüsselung verwenden.

Je nach Server, mit dem Sie sprechen (insbesondere, wenn es sich um einen Drittanbieterdienst handelt), müssen Sie möglicherweise die Weiterleitungsgeheimnis deaktivieren oder eine niedrigere TLS-Ebene auswählen. Weitere Informationen finden Sie im Abschnitt "Konfigurieren von ATS-Optionen" weiter unten.

Wichtig

App Transport Security gilt nicht für Xamarin-Apps mit verwalteten HTTPClient-Implementierungen. Sie gilt nur für Verbindungen mit CFNetwork HTTPClient-Implementierungen oder NSURLSession HTTPClient-Implementierungen .

Festlegen der HTTPClient-Implementierung

Um die von einer iOS-App verwendete HTTPClient-Implementierung festzulegen, doppelklicken Sie im Projektmappen-Explorer auf das Projekt, um die Projektoptionen zu öffnen. Navigieren Sie zu iOS Build , und wählen Sie den gewünschten Clienttyp unter der Dropdownliste " HttpClient-Implementierung " aus:

Setting the iOS Build Options

Verwalteter Handler

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

Vorteile:

  • Es ist die kompatibelste mit Microsoft .NET und ältere Version von Xamarin.

Nachteile:

  • Es ist nicht vollständig in iOS integriert (z. B. auf TLS 1.0 beschränkt).
  • Es ist in der Regel viel langsamer als die systemeigenen APIs.
  • Es erfordert mehr verwalteten Code und erstellt größere Apps.

CFNetwork-Handler

Der CFNetwork-basierte Handler basiert auf dem systemeigenen CFNetwork Framework.

Vorteile:

  • Verwendet systemeigene API für eine bessere Leistung und kleinere ausführbare Größen.
  • Fügt Unterstützung für neuere Standards wie TLS 1.2 hinzu.

Nachteile:

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

NSUrlSession-Handler

Der NSUrlSession-basierte Handler basiert auf der systemeigenen NSUrlSession API.

Vorteile:

  • Verwendet systemeigene API für eine bessere Leistung und kleinere ausführbare Größen.
  • Fügt Unterstützung für neuere Standards wie TLS 1.2 hinzu.

Nachteile:

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

Diagnose von ATS-Problemen

Wenn Sie versuchen, eine Verbindung mit dem Internet herzustellen, entweder direkt oder aus einer Webansicht in iOS 9, wird möglicherweise ein Fehler im Formular angezeigt:

App Transport Security hat die Last einer HTTP-Ressource (http://www.-the-blocked-domain.comCleartext) blockiert, da sie unsicher ist. Temporäre Ausnahmen können über die Info.plist-Datei Ihrer App konfiguriert werden.

In iOS9 erzwingt App Transport Security (ATS) sichere Verbindungen zwischen Internetressourcen (z. B. dem Back-End-Server der App) und Ihrer App. Darüber hinaus erfordert ATS die Kommunikation mit dem Protokoll und der HTTPS allgemeinen API-Kommunikation, die mit TLS Version 1.2 mit Weiterleitungsgeheimnis verschlüsselt werden soll.

Da ATS standardmäßig in Apps aktiviert ist, die für iOS 9 und OS X 10.11 (El Capitan) erstellt wurden, unterliegen alle Verbindungen, CFURL die ATS-Sicherheitsanforderungen verwenden NSURLConnectionoder NSURLSession unterliegen. Wenn Ihre Verbindungen diese Anforderung nicht erfüllen, werden sie mit einer Ausnahme fehlschlagen.

Apple stellt außerdem die TLSTool-Beispiel-App bereit, die kompiliert (oder optional in Xamarin und C#transcodiert) und zum Diagnostizieren von ATS/TLS-Problemen verwendet werden kann. Informationen zum Beheben dieses Problems finden Sie im Abschnitt "Opting-Out of ATS " weiter unten.

Konfigurieren von ATS-Optionen

Sie können verschiedene Features von ATS konfigurieren, indem Sie Werte für bestimmte Schlüssel in der Info.plist-Datei Ihrer App festlegen. Die folgenden Schlüssel stehen für die Steuerung von ATS zur Verfügung (eingezogen, um zu zeigen, wie sie geschachtelt sind):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Jeder Schlüssel hat den folgenden Typ und die Folgende Bedeutung:

  • NSAppTransportSecurity (Dictionary) – Enthält alle Einstellungsschlüssel und Werte für ATS.
  • NSAllowsArbitraryLoads (Boolean) – Wenn YES ATS für eine do deaktiviert wird Standard nicht aufgeführt in NSExceptionDomains. Für aufgeführte Do Standard s werden die angegebenen Sicherheitseinstellungen verwendet.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) – Wenn YES webseiten ordnungsgemäß geladen werden können, während der Schutz von Apple Transport Security (ATS) für den Rest der App noch aktiviert ist.
  • NSExceptionDo Standard s (Dictionary) – Eine Sammlung von Do Standard s, die und die Sicherheitseinstellungen, die ATS für eine bestimmte Aufgabe verwenden sollte Standard.
  • <do Standard-name-for-exception-as-string> (Dictionary) – Eine Sammlung von Ausnahmen für eine bestimmte Do Standard (z. B. www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String) – Die minimale TLS-Version entweder TLSv1.0oder TLSv1.1TLSv1.2 (die Standardeinstellung).
  • NSExceptionRequiresForwardSecrecy (Boolean) – Wenn NO dies der Fall ist Standard muss keine Verschlüsselung mit Vorwärtssicherheit verwenden. Der Standardwert ist YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) – Wenn NO (standard) alle Kommunikationen mit dieser Funktion erfolgen Standard muss sich im HTTPS Protokoll befinden.
  • NSRequiresCertificateTransparency (Boolean) – Wenn YES dies zu tun ist Standard ssl (Secure Sockets Layer) muss gültige Transparenzdaten enthalten. Der Standardwert ist NO.
  • NSIncludesSubdo Standard s (Boolean) – Wenn YES diese Einstellungen alle Unterdo Standard davon außer Kraft setzen Standard. Der Standardwert ist NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) – Die TLS-Version, die beim Ausführen verwendet wird Standard ist ein Drittanbieterdienst außerhalb der Kontrolle des Entwicklers.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) – Wenn YES ein Drittanbieter dies tut Standard die Weiterleitungsgeheimnis erfordert.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) – Wenn YES das ATS die nicht sichere Kommunikation mit Drittanbietern zulässt Standard s.

Abmelden von ATS

Während Apple dringend die Verwendung des HTTPS Protokolls und der sicheren Kommunikation mit internetbasierten Informationen vorschlägt, kann es vorkommen, dass dies nicht immer möglich ist. Wenn Sie z. B. mit einem Drittanbieterwebdienst kommunizieren oder internetbezogene Werbung in Ihrer App verwenden.

Wenn Ihre Xamarin.iOS-App eine Anforderung an eine unsichere Funktion stellen muss Standard werden die folgenden Änderungen an der Info.plist-Datei Ihrer App die Sicherheitsstandards deaktiviert, die ATS für eine bestimmte Funktion erzwingt Standard:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Doppelklicken Sie in Visual Studio für Mac in der Projektmappen-Explorer auf die Info.plist Datei, wechseln Sie zur Quellansicht, und fügen Sie die oben genannten Schlüssel hinzu:

The Source view of the Info.plist file after adding specified keys.

Wenn Ihre App Webinhalte von nicht sicheren Websites laden und anzeigen muss, fügen Sie der Info.plist-Datei Ihrer App Folgendes hinzu, damit Webseiten ordnungsgemäß geladen werden können, während der Schutz von Apple Transport Security (ATS) für den Rest der App weiterhin aktiviert ist:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Optional können Sie die folgenden Änderungen an der Info.plist-Datei Ihrer App vornehmen, um ATS für alle Aktionen Standard s und Internetkommunikation vollständig zu deaktivieren:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Doppelklicken Sie in Visual Studio für Mac in der Projektmappen-Explorer auf die Info.plist Datei, wechseln Sie zur Quellansicht, und fügen Sie die oben genannten Schlüssel hinzu:

The Source view of the Info.plist file after specifying NSAllowsArbitraryLoadsInWebContent and NSAllowsArbitraryLoads.

Wichtig

Wenn Ihre Anwendung eine Verbindung mit einer unsicheren Website erfordert, sollten Sie immer die Do Standard als Ausnahme NSExceptionDomains eingeben, anstatt ATS vollständig zu verwendenNSAllowsArbitraryLoads. NSAllowsArbitraryLoads sollte nur in extremen Notfallsituationen verwendet werden.

Auch hier sollte die Deaktivierung von ATS nur als letztes Mittel verwendet werden, wenn der Wechsel zu sicheren Verbindungen entweder nicht verfügbar oder unpraktisch ist.

Zusammenfassung

In diesem Artikel wurde App Transport Security (ATS) eingeführt und die Art und Weise beschrieben, wie sie sichere Kommunikation mit dem Internet erzwingt. Zunächst wurden die Änderungen von ATS behandelt, die für eine Xamarin.iOS-App erforderlich sind, die unter iOS 9 ausgeführt wird. Anschließend behandelten wir die Steuerung von ATS-Features und -Optionen. Schließlich haben wir die Abmeldung von ATS in Ihrer Xamarin.iOS-App behandelt.