Das HTTP-Laden von NSURLSession / NSURLConnection ist unter iOS 9 fehlgeschlagen


137

Ich habe versucht, meine vorhandene App unter iOS9 auszuführen, aber bei der Verwendung ist ein Fehler aufgetreten AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

Ich erhalte folgende Fehlermeldung:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Außerdem erhalten Sie folgende Protokolle:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

Update: Ich habe meiner Lösung mehrere Updates hinzugefügt: NSURLSession / NSURLConnection HTTP-Laden unter iOS 9 fehlgeschlagen


Sind Sie sicher, dass der Fehler in der ersten Zeile auftritt?
BSMP

1
Ich hatte das gleiche Problem. Dies schien das Problem abzudecken
phillies2628

Antworten:


240

Gefundene Lösung:

In iOS9 erzwingt ATS Best Practices bei Netzwerkanrufen, einschließlich der Verwendung von HTTPS.

Aus der Apple-Dokumentation:

ATS verhindert versehentliche Offenlegung, bietet sicheres Standardverhalten und ist einfach anzuwenden. Sie sollten ATS so schnell wie möglich einführen, unabhängig davon, ob Sie eine neue App erstellen oder eine vorhandene aktualisieren. Wenn Sie eine neue App entwickeln, sollten Sie ausschließlich HTTPS verwenden. Wenn Sie über eine vorhandene App verfügen, sollten Sie HTTPS so oft wie möglich verwenden und einen Plan für die baldige Migration des Rests Ihrer App erstellen.

In Beta 1 gibt es derzeit keine Möglichkeit, dies in info.plist zu definieren. Die Lösung besteht darin, es manuell hinzuzufügen:

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

Geben Sie hier die Bildbeschreibung ein

Update1: Dies ist eine vorübergehende Problemumgehung, bis Sie bereit sind, die iOS9 ATS-Unterstützung zu übernehmen.

Update2: Weitere Informationen finden Sie unter folgendem Link: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: Wenn Sie versuchen, eine Verbindung zu einem Host (YOURHOST.COM) herzustellen, der nur TLS 1.0 enthält

Fügen Sie diese zur Info.plist Ihrer App hinzu

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Beachten Sie, dass Sie Application Transport Security gerade vollständig entfernt haben, sodass eine wichtige iOS 9-Funktion in Ihrer App nicht mehr verfügbar ist. Dies ist ein Hack, und ich wäre nicht überrascht, wenn dieser Hack Ihre AP ablehnen würde. Das Hinzufügen bestimmter Websites zu diesen Wörterbüchern ist mit größerer Wahrscheinlichkeit zulässig.
Gnasher729

2
@StevenPeterson Sie können nur von Fall zu Fall eine gesamte App von Apple ausschließen lassen. Ich gehe davon aus, dass Apple Sie anweist, diesen Schlüssel einzuschließen, wenn Apple Ihre App mit dieser Fähigkeit segnet. Erwarten Sie, dass Apple dies selten tut.
Mattyohe

8
Bitte, bitte, bitte, bitte, bitte - fügen Sie nicht einfach die Ausnahme zu Ihrer Liste hinzu und fahren Sie mit "nur weil es funktioniert" fort. Berücksichtigen Sie die Sicherheit der Daten Ihres Benutzers und implementieren Sie SSL und andere bewährte Sicherheitsmethoden.
Weihnachtsmann

8
@ gnasher729, ich verstehe, dass es besser ist, TLS 1.2 zu unterstützen, als nur ATS zu deaktivieren. Was können Sie jedoch tun, wenn Sie sich auf eine API / einen Webdienst eines Drittanbieters verlassen? Ich kann sie nicht zum Upgrade zwingen. Was kann ich also tun?
Woodstock

7
Es gibt einen subtilen Fehler in dieser Antwort: NSTemporaryExceptionMinimumTLSVersionmuss zB TLSv1.0 anstelle von 1.0 sein , siehe NSAppTransportSecurity Exception Domains Wörterbuchschlüssel
mbi

54

Umgang mit SSL in iOS9 , Eine Lösung besteht darin, Folgendes zu tun:

Wie der Apple sagt: Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

iOS 9 und OSX 10.11 erfordern TLSv1.2 SSL für alle Hosts, von denen Sie Daten anfordern möchten, es sei denn, Sie geben Ausnahmedomänen in der Info.plist-Datei Ihrer App an.

Die Syntax für die Info.plist-Konfiguration sieht folgendermaßen aus:

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

Wenn Ihre Anwendung (z. B. ein Webbrowser eines Drittanbieters) eine Verbindung zu beliebigen Hosts herstellen muss, können Sie sie folgendermaßen konfigurieren:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Wenn Sie dies tun müssen, ist es wahrscheinlich am besten, Ihre Server für die Verwendung von TLSv1.2 und SSL zu aktualisieren, sofern dies noch nicht geschehen ist. Dies sollte als vorübergehende Problemumgehung betrachtet werden.

Bis heute werden in der Vorabversionsdokumentation keine dieser Konfigurationsoptionen in irgendeiner Weise erwähnt. Sobald dies der Fall ist, aktualisiere ich die Antwort, um auf die entsprechende Dokumentation zu verlinken.

Weitere Informationen finden Sie unter iOS9AdaptationTips


4
SSL und TLS sind unterschiedliche Verschlüsselungsschichten, die von den HTTPS-Protokollen verwendet werden. Daher sollte man SSL vollständig deaktivieren und TLS v1.2 oder höher verwenden. Für weitere Informationen würde ich empfehlen, mit der folgenden Ressource zu beginnen: SSL / TLS Security 2015 - Eine vereinfachte Kurzanleitung
Conrad Taylor

2
Ich habe nur Glück mit dem unteren Beispiel hinzugefügt, in dem Sie NSAllowsArbitraryLoads auf true setzen. Mein Server verwendet ausschließlich TLS v1.2 und ich muss dies noch tun, damit es funktioniert. Sehr frustrierend.
Roller

1
Gibt es also eine Problemumgehung, mit der ich sichergehen kann, dass meine neue App im App Store genehmigt wird, z. B. ein Proxy-Service?
Josh

41

Apples Technote zur App-Transportsicherheit ist sehr praktisch . Es hat uns geholfen, eine sicherere Lösung für unser Problem zu finden.

Hoffentlich hilft das jemand anderem. Wir hatten Probleme beim Herstellen einer Verbindung zu Amazon S3-URLs, die als vollkommen gültig erschienen, TLSv12-HTTPS-URLs. Es stellte sich heraus, dass wir deaktivieren mussten, um NSExceptionRequiresForwardSecrecyeine weitere Handvoll Chiffren zu aktivieren, die S3 verwendet.

In unserem Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

Dies war mein genaues Problem und es hat es sofort behoben! Danken! :)
Alex Zak

Dies löst das Problem, das ich auch hatte; Für verschiedene Fälle sind jedoch möglicherweise unterschiedliche Einstellungen erforderlich. Die gute Nachricht ist, dass der Technote auch Informationen zur Verwendung von nsurl enthält, mit denen Sie die richtigen Einstellungen im Allgemeinen finden können.
Ecotax

Ich musste dasselbe für cloudfront.net tun, wenn ich ein CDN vor Amazon S3 verwendete.
Raymond26

7

Wenn Sie dieses Problem mit Amazon S3 wie mir haben, versuchen Sie, es als direktes untergeordnetes Element Ihres Top-Level-Tags in Ihre info.plist einzufügen

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

Weitere Informationen finden Sie unter:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
Gott segne dich Bruder
Vervatovskis

5

Ich habe von hier aus eine Lösung gefunden. Und es funktioniert für mich.

Überprüfen Sie dies, es kann Ihnen helfen.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>

4

Fügen Sie einfach die folgenden Felder in Ihre .plist-Datei ein

Geben Sie hier die Bildbeschreibung ein

Die Syntax sieht folgendermaßen aus:

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

Dies ermöglicht alle http-Anfragen. Funktioniert, wird aber nicht empfohlen.
KVISH

2

Aktualisieren:

Ab Xcode 7.1 müssen Sie das NSAppTransportSecurityWörterbuch nicht mehr manuell in das Verzeichnis eingeben info.plist.

Es wird jetzt automatisch für Sie vervollständigt, erkennt, dass es sich um ein Wörterbuch handelt, und vervollständigt dann auch die Allows ArbitraryLasten automatisch . info.plist Screenshot


Dies ermöglicht alle http-Anfragen. Funktioniert, wird aber nicht empfohlen.
KVISH

2

Lösen Sie den Fehler beim Laden des NSURLConnection-HTTP-Fehlers. Fügen Sie einfach den folgenden Dict in der info.plist hinzu:

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

1

Ich habe es durch Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, die ich befolgt habe, sind:

Ich habe die Datei info.plist meines Projekts geöffnet

Es wurde ein Schlüssel namens NSAppTransportSecurity als Wörterbuch hinzugefügt.

Es wurde ein Unterschlüssel mit dem Namen NSAllowsArbitraryLoads als Boolescher Wert hinzugefügt und der Wert wie im folgenden Bild auf YES gesetzt. Geben Sie hier die Bildbeschreibung ein

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

Referenzlink: https://stackoverflow.com/a/32609970


1

Dies hat bei mir funktioniert, als ich diesen Fehler hatte:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

Sie können versuchen, diese Funktion in der Datei RCTHTTPRequestHandler.m hinzuzufügen

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

Überprüfen Sie zusätzlich zu den oben genannten Antworten Ihre URL erneut


In meinem Fall habe ich versucht, eine HTML-Datei zu laden.
Vaishnavi

0

Sie sollten hinzufügen App Transport Security Settingszu info.plistund fügen Sie Allow Arbitrary LoadszuApp Transport Security Settings

Geben Sie hier die Bildbeschreibung ein

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.