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:
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.com
Cleartext) 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 NSURLConnection
oder 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
) – WennYES
ATS für eine do deaktiviert wird Standard nicht aufgeführt inNSExceptionDomains
. Für aufgeführte Do Standard s werden die angegebenen Sicherheitseinstellungen verwendet. - NSAllowsArbitraryLoadsInWebContent (
Boolean
) – WennYES
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 entwederTLSv1.0
oderTLSv1.1
TLSv1.2
(die Standardeinstellung). - NSExceptionRequiresForwardSecrecy (
Boolean
) – WennNO
dies der Fall ist Standard muss keine Verschlüsselung mit Vorwärtssicherheit verwenden. Der Standardwert istYES
. - NSExceptionAllowsInsecureHTTPLoads (
Boolean
) – WennNO
(standard) alle Kommunikationen mit dieser Funktion erfolgen Standard muss sich imHTTPS
Protokoll befinden. - NSRequiresCertificateTransparency (
Boolean
) – WennYES
dies zu tun ist Standard ssl (Secure Sockets Layer) muss gültige Transparenzdaten enthalten. Der Standardwert istNO
. - NSIncludesSubdo Standard s (
Boolean
) – WennYES
diese Einstellungen alle Unterdo Standard davon außer Kraft setzen Standard. Der Standardwert istNO
. - NSThirdPartyExceptionMinimumTLSVersion (
String
) – Die TLS-Version, die beim Ausführen verwendet wird Standard ist ein Drittanbieterdienst außerhalb der Kontrolle des Entwicklers. - NSThirdPartyExceptionRequiresForwardSecrecy (
Boolean
) – WennYES
ein Drittanbieter dies tut Standard die Weiterleitungsgeheimnis erfordert. - NSThirdPartyExceptionAllowsInsecureHTTPLoads (
Boolean
) – WennYES
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:
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:
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.