iOS9 erhält Fehler "Es ist ein SSL-Fehler aufgetreten und es kann keine sichere Verbindung zum Server hergestellt werden."


Antworten:


122

Für iOS9 traf Apple mit iOS 9 eine radikale Entscheidung und deaktivierte den gesamten ungesicherten HTTP-Verkehr von iOS-Apps als Teil von App Transport Security (ATS) .

Um ATS einfach zu deaktivieren, können Sie diese Schritte ausführen , indem Sie Info.plist öffnen und die folgenden Zeilen hinzufügen:

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

45
Ich habe die obigen Zeilen in plist hinzugefügt, erhalte aber immer noch den folgenden Fehler: Ein SSL-Fehler ist aufgetreten und eine sichere Verbindung zum Server kann nicht hergestellt werden. NSLocalizedRecoverySuggestion = Möchten Sie trotzdem eine Verbindung zum Server herstellen?, _KCFNetworkCFStreamSSLErrorOriginalValue = -9819 Ich rufe eine HTTPS-Anforderung auf. Gibt es eine andere Option für HTTPS?
AiOsN

1
AiOsN = das gleiche Problem hier, haben Sie eine Lösung gefunden?
Franck

5
Es scheint eine häufige Fehlinterpretation zu sein, dass NSAllowsArbitraryLoads ein Schalter zum Aktivieren oder Deaktivieren von ATS ist. Sobald Sie eine https: // -Anforderung ausführen, müssen Sie sicherstellen, dass Sie die ATS-Anforderungen erfüllen: Ein gültiges Zertifikat, das auf dem Server installiert ist (ohne Platzhalter, genau passend zum Domänennamen des Servers), unterstützt der Server TLS 1.2 mit Weiterleitung Geheimhaltung.
Christian

@Christian Woher stammen diese ATS-Anforderungen? Ich kann nichts darüber finden, Wildcard-Zertifikate nicht zu unterstützen.
Bart

@Bartosz Entschuldigung, ich kann Sie nicht auf ein offizielles Dokument verweisen. Dies ist nur etwas, was wir bei der Aktualisierung unserer Serverinfrastruktur beobachtet haben.
Christian

64

Obwohl das Zulassen beliebiger Ladevorgänge ( NSAllowsArbitraryLoads = true) eine gute Problemumgehung ist, sollten Sie ATS nicht vollständig deaktivieren, sondern die HTTP-Verbindung aktivieren, die Sie zulassen möchten:

<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>

2
Viel besser als alle Sicherheitsprobleme zu ignorieren. Der S3-Dienst von Amazon verwendet eine schwache Verschlüsselung, und das Laden direkt auf die Server verursachte Probleme. Dadurch konnten wir jedoch nur die URL s3.amazonaws.com öffnen und den Rest inline halten. Genial!
mix3d

3
Der Server, den ich erreichen wollte, verwendete TLSv1.0. Ich musste NSExceptionMinimumTLSVersion für tls1.0 hinzufügen, um den SLL-Fehler zu umgehen
Ispas Claudiu

Diese Antwort hat bei mir funktioniert. Ich habe ein WKWebView verwendet und versucht, eine SSL-Anforderung an den API-Server zu senden.
Fan Jin

Hi @ Stéphane, ich habe eine seltsame Situation. Mein Telefon hat iOS Version 12.1.2, aber ich habe die Fehlermeldung "Ein SSL-Fehler ist aufgetreten und eine sichere Verbindung zum Server kann nicht hergestellt werden" erhalten. Was ich getan habe, ist meine Plist-Datei aktualisiert. App läuft gut und wieder habe ich die Änderungen entfernt, die ich in info.plist vorgenommen habe. Jetzt läuft es gut. Daher kann ich den tatsächlichen Grund für diesen Fehler nicht finden. Irgendein Vorschlag?
Mansuu ....

@ Mansuu .... haben Sie versucht, TLSv1.0 zu verwenden, wie in den obigen Kommentaren vorgeschlagen?
Stéphane Bruckert

15

iOS 9 erzwingt, dass Verbindungen, die HTTPS verwenden, TLS 1.2 sind, um aktuelle Sicherheitslücken zu vermeiden. In iOS 8 wurden sogar unverschlüsselte HTTP-Verbindungen unterstützt, sodass auch ältere TLS-Versionen keine Probleme bereiteten. Um dieses Problem zu umgehen, können Sie dieses Code-Snippet zu Ihrer Info.plist hinzufügen:

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

* verwiesen auf App Transport Security (ATS)

Geben Sie hier die Bildbeschreibung ein


1
Für Swift 4+, App Transport Sicherheitseinstellungen -> Beliebige Lasten zulassen = JA
mehdigriche

14

Wenn Sie nur auf bestimmte Domänen abzielen, können Sie versuchen, diese in die Info.plist Ihrer Anwendung aufzunehmen:

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

Das hat bei mir nicht funktioniert. Ja, ich habe die richtige Domain für "example.com" eingegeben.
Alyoshak

1
Es ist Arbeit für mich. als ich das beispiel nur mit dem "Allow Arbitrary Loads" gemacht habe funktioniert das aber danach gestoppt. Wenn ich den Schlüssel "NSExceptionRequiresForwardSecrecy" -> false und "NSIncludesSubdomains" -> true verwendet habe, funktioniert es perfekt. Vielen Dank!
Linhadiretalipe

1
Das hat auch bei mir funktioniert! Obwohl ich eine https-Verbindung verwende, war ich dennoch mit dem Problem konfrontiert. Derzeit wird 'NSExceptionRequiresForwardSecrecy' nicht unterstützt. Nach dem, was ich gelesen habe, musste dies nicht früher angegeben werden, aber es sieht so aus, als hätten sie dies jetzt auch obligatorisch gemacht. PS: Ich habe es mit iOS 10.2.1 versucht
Vaibhav Misra

6

Es scheint, dass iOS 9.0.2 Anforderungen an gültige HTTPS-Endpunkte unterbricht. Mein aktueller Verdacht ist, dass SHA-256-Zertifikate erforderlich sind oder dass dies mit diesem Fehler fehlschlägt.

Überprüfen Sie zum Reproduzieren Ihre UIWebView mit Safari und versuchen Sie, zu einem beliebigen HTTPS-Endpunkt zu navigieren:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

Versuchen Sie jetzt, auf Google zu gehen (da sie natürlich ein SHA-256-Zertifikat haben):

location.href = "https://google.com"
// no problemo

Das Hinzufügen einer Ausnahme zur Transportsicherheit (wie in der obigen Antwort von @ stéphane-bruckert beschrieben) behebt dieses Problem. Ich gehe auch davon aus, dass das komplett deaktiviert istNSAppTransportSecurity auch funktionieren würde, obwohl ich gelesen habe, dass eine vollständige Deaktivierung Ihre App-Überprüfung gefährden kann.

[BEARBEITEN] Ich habe festgestellt, dass das Auflisten der Domänen, mit denen ich im Diktat eine Verbindung herstelle, NSExceptionDomainsdieses Problem behebt, selbst wenn der Wert NSExceptionAllowsInsecureHTTPLoadsauf true gesetzt bleibt. : \


2

Das Problem ist das SSL-Zertifikat auf der Serverseite. Entweder stört etwas oder das Zertifikat stimmt nicht mit dem Dienst überein. Zum Beispiel, wenn eine Site ein SSL-Zertifikat für www.mydomain.com hat, während der von Ihnen verwendete Dienst auf myservice.mydomain.com ausgeführt wird. Das ist eine andere Maschine.


Ich bekomme das Problem mit einigen URLs, aber nicht mit anderen unter der gleichen IP-Adresse (Domain und Server)
user6631314


0

Xcode-Projekt -> Gehen Sie zu info.plist und klicken Sie auf +, dann auf Hinzufügen (Sicherheitseinstellungen für den App-Transport). Erweitern, Beliebige Lasten zulassen. JA. Vielen Dank


@AbdulYasin Überprüfen Sie Ihre Liste und überprüfen Sie, ob Wetteränderungen aktualisiert wurden oder nicht?
Shanmugasundharam

1
Diese "entspannte" Antwort lässt die mit dieser Problemumgehung verbundenen Erklärungen und Sicherheitsrisiken völlig aus.
Manuel


0

In meinem Fall trat dieses Problem in meinem Simulator auf, weil das Datum meines Computers hinter dem aktuellen Datum lag. Überprüfen Sie diesen Fall auch, wenn ein SSL-Fehler auftritt.


0

Bei der Wiedergabe wurde der Fehler unterschritten

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

Ich habe sichergestellt, dass ich einen Eintrag in Ausnahmedomänen in der plist-Datei hinzugefügt habe und NSAllowsArbitraryLoads auf true gesetzt ist, und trotzdem wurde ein Fehler angezeigt.

Dann wurde mir klar, dass ich URL mit https und nicht mit http spiele.

Ich habe die Video-URL auf http gesetzt und das Problem behoben.


0

Ich habe diesen Fehler für einige Netzwerkanrufe und nicht für andere erhalten. Ich war mit einem öffentlichen WLAN verbunden. Das kostenlose WLAN schien bestimmte URLs und damit den Fehler zu manipulieren.

Als ich mich mit LTE verband, ging dieser Fehler weg!

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.