Seit ich mein bestehendes Projekt mit iOS 9 aktualisiert habe, wird immer wieder der folgende Fehler angezeigt:
Ein SSL-Fehler ist aufgetreten und eine sichere Verbindung zum Server kann nicht hergestellt werden.
Seit ich mein bestehendes Projekt mit iOS 9 aktualisiert habe, wird immer wieder der folgende Fehler angezeigt:
Ein SSL-Fehler ist aufgetreten und eine sichere Verbindung zum Server kann nicht hergestellt werden.
Antworten:
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>
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>
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)
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>
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, NSExceptionDomains
dieses Problem behebt, selbst wenn der Wert NSExceptionAllowsInsecureHTTPLoads
auf true gesetzt bleibt. : \
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 erhalte den gleichen Fehler, wenn ich meine HTTPS-URL wie folgt anführe: https://www.mywebsite.com . Es funktioniert jedoch einwandfrei, wenn ich es ohne die drei Ws wie folgt spezifiziere: https://mywebsite.com .
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
Mein Problem war NSURLConnection
und das war in iOS9 veraltet, also habe ich die gesamte API geändert NSURLSession
und das hat mein Problem behoben.
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.
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.