it-swarm.com.de

Wie lade ich eine HTTP-URL mit aktivierter App Transport-Sicherheit in iOS 9?

Das neue Beta-SDK für iOS, das gestern Abend veröffentlicht wurde, enthält "App Transport Security", das Entwickler dazu ermutigt, https anstelle von http zu verwenden. Im Prinzip ist dies eine großartige Idee, und ich verwende https bereits in unseren Staging-/Produktionsumgebungen. Ich habe jedoch kein https in meiner lokalen Entwicklungsumgebung eingerichtet, wenn die iOS-App eine Verbindung zu einem Webdienst herstellt, den ich auf meinem Laptop ausführe.

Nach einigem Hin und Her scheint das URL-Ladesystem, selbst wenn Sie ihm eine http-URL geben, sich dafür zu entscheiden, stattdessen https zu verwenden. Weiß jemand, wie man dieses Verhalten deaktiviert - auch nur für bestimmte URLs?

410

Ausführliche Informationen finden Sie in Apples Info.plist-Referenz (danke @ gnasher729).

Sie können Ausnahmen für bestimmte Domänen in Ihrer Info.plist hinzufügen:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Alle Schlüssel für jede ausgenommene Domäne sind optional. Der Redner hat keinen der Schlüssel herausgearbeitet, aber ich denke, sie sind alle einigermaßen offensichtlich.

(Quelle: WWDC 2015-Sitzung 703, „Datenschutz und Ihre App“ , 30:18)

Sie können auch alle App-Transport-Sicherheitsbeschränkungen mit einem einzigen Schlüssel ignorieren, wenn Ihre App einen guten Grund dafür hat:

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

Wenn Ihre App keinen guten Grund hat, können Sie die Ablehnung riskieren:

Wenn Sie NSAllowsArbitraryLoads auf true setzen, funktioniert dies, aber Apple wollte Apps, die dieses Flag verwenden, ohne bestimmten Grund ablehnen. Der Hauptgrund für die Verwendung von NSAllowsArbitraryLoads sind vom Benutzer erstellte Inhalte (gemeinsame Nutzung von Links, benutzerdefinierter Webbrowser usw.). In diesem Fall erwartet Apple weiterhin, dass Sie Ausnahmen einschließen, die den ATS für die URLs erzwingen, für die Sie die Kontrolle haben.

Wenn Sie Zugriff auf bestimmte URLs benötigen, die nicht über TLS 1.2 bereitgestellt werden, müssen Sie bestimmte Ausnahmen für diese Domänen schreiben. Verwenden Sie nicht NSAllowsArbitraryLoads, das auf yes festgelegt ist. Weitere Informationen finden Sie in der NSURLSesssion-WWDC-Sitzung.

Seien Sie bitte vorsichtig beim Teilen der NSAllowsArbitraryLoads-Lösung. Es ist nicht die von Apple empfohlene Lösung.

- kcharwood (danke @ marco-tolman)

672
adurdin

Als akzeptierte Antwort wurden erforderliche Informationen bereitgestellt, und für weitere Informationen zur Verwendung von und Deaktivieren von App Transport Security finden Sie weitere Informationen daz .

Fügen Sie für domänenspezifische Ausnahmen diese zur Info.plist hinzu:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Aber was ist, wenn ich nicht alle unsicheren Domänen kenne, die ich verwenden muss? Verwenden Sie den folgenden Schlüssel in Ihren Informationen .plist

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Für weitere Details können Sie von diesem Link erhalten.

105

Gefolgt von this .

Ich habe es mit dem Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, denen ich gefolgt bin, sind:

  1. Öffnete meine Projekte info.plist Datei

  2. Ein Schlüssel mit dem Namen NSAppTransportSecurity wurde als Dictionary hinzugefügt.

  3. Es wurde ein Unterschlüssel mit dem Namen NSAllowsArbitraryLoads als Boolean hinzugefügt und sein Wert auf YES gesetzt, wie in der folgenden Abbildung dargestellt. enter image description here

Bereinigen Sie das Projekt und jetzt läuft alles wie zuvor.

Ref Link .

54
Manab Kumar Mal

Wenn Sie nur die App Transport-Richtlinie für lokale Entwickler-Server deaktivieren möchten, funktionieren die folgenden Lösungen einwandfrei. Dies ist hilfreich, wenn Sie HTTPS nicht einrichten können oder wenn dies nicht praktikabel ist (z. B. bei Verwendung des Google App Engine-Entwicklerservers).

Wie andere bereits gesagt haben, sollte ATP für Produktions-Apps auf keinen Fall deaktiviert werden.

1) Verwenden Sie für das Debuggen eine andere Plist

Kopieren Sie Ihre Plist-Datei und NSAllowsArbitraryLoads. Verwenden Sie diese Plist zum Debuggen.

XCode Debug

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

2) Lokale Server ausschließen

Alternativ können Sie eine einzelne plist-Datei verwenden und bestimmte Server ausschließen. Allerdings es sieht nicht so aus, als könnten Sie IP 4-Adressen ausschließen , sodass Sie möglicherweise stattdessen den Servernamen verwenden müssen (in den Systemeinstellungen -> Freigabe oder in Ihrem lokalen DNS konfiguriert).

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>
30
Ian

Ich habe als plist Datei gelöst.

  1. Fügen Sie ein NSAppTransportSecurity: Dictionary hinzu.
  2. Fügen Sie den Unterschlüssel "NSAllowsArbitraryLoads" als Boolean hinzu: YES

enter image description here

29
Avinash651

Die obigen Konfigurationen haben bei mir nicht funktioniert. Ich habe viele Tastenkombinationen ausprobiert, diese funktionieren einwandfrei:

enter image description here

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
21
Damien Romito

Kompilieren der Antworten von @adurdin und @User

Fügen Sie Ihrer info.plist Folgendes hinzu und ändern Sie localhost.com mit Ihrem entsprechenden Domain-Namen. Sie können auch mehrere Domains hinzufügen:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

Ihre info.plist muss so aussehen:

enter image description here

17
Aqib Mumtaz

Folgendes hat bei mir funktioniert:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>

Ich möchte dies nur hinzufügen, um anderen zu helfen und etwas Zeit zu sparen:

wenn Sie verwenden: CFStreamCreatePairWithSocketToHost. Stellen Sie sicher, dass Ihr Host mit dem in Ihrem .plist übereinstimmt, oder fügen Sie ihn dort hinzu, wenn Sie eine separate Domain für den Socket haben.

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

Hoffe das ist hilfreich. Prost. :)

13
0yeoj