web-dev-qa-db-de.com

NSURLSession "HTTP-Ladevorgang fehlgeschlagen. KCFStreamErrorDomainSSL, -9813; Selbstsignierendes Zertifikat

Ich versuche, meine iOS-App mit einer HTTPS Rails App, die derzeit auf einem lokalen Host in meinem Netzwerk ausgeführt wird. Ich kann über meinen Browser mit https://myIP:3000/display Auf die Site zugreifen. Ich versuche, von meiner App aus darauf zuzugreifen, indem ich Folgendes verwende:

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //let url = NSURL(string: "https://another/Sinatra/website/feed")
        let url = NSURL(string: "https://myIP:3000/display")

        let request = NSURLRequest(URL: url!)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
        task!.resume()
    }

Wenn ich versuche, auf die sinatra-Website zuzugreifen, habe ich keine Probleme und kann sogar den JSON-Code mit den richtigen Befehlen auf der Konsole ausdrucken. Wenn ich jedoch die URL zu meiner Rails Website einstelle, wird die folgende Fehlermeldung angezeigt.

HTTP-Laden von NSURLSession/NSURLConnection fehlgeschlagen (kCFStreamErrorDomainSSL, -9813)

Außerdem kann ich feststellen, dass meine localhost Rails App (auf dem anderen Computer) nicht über die iOS-App gepingt wird, sondern über den Browser und den Befehl curl.

Irgendwelche Ideen, wie man das behebt?

42
Marcus

Wenn ich es richtig verstanden habe, möchten Apple jetzt, dass die Entwickler HTTPS und TLS 1.2 für Netzwerkanrufe verwenden.

Temporär können Sie dies in Ihrer "Info.plist" -Datei hinzufügen:

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

Schauen Sie einfach auf diesen Link, er kann Ihnen auch helfen: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

-

Update : Nach einigen Kommentaren funktioniert die obige Lösung nicht mehr. Hier ist eine aktualisierte Lösung.

  1. Gehen Sie zu Ihrer Info.plist - Datei.
  2. Fügen Sie eine Zeile von TypDictionary und von SchlüsselApp Transport Security Settings Hinzu.
  3. Fügen Sie in diesem Wörterbuch eine Zeile von TypBoolean, von SchlüsselAllow Arbitrary Loads Und von WertYES

-

Andernfalls können Sie Domain Exceptions Einstellen. So geht's:

  1. Gehen Sie zu Ihrer Info.plist - Datei.
  2. Fügen Sie eine Zeile von TypDictionary und von SchlüsselApp Transport Security Settings Hinzu.
  3. Fügen Sie eine Zeile von TypDictionary und von SchlüsselException Domains Hinzu.
  4. Fügen Sie eine Zeile von TypDictionary und von SchlüsselThe domain Hinzu.
  5. Fügen Sie zwei Zeilen von TypBoolean und von SchlüsselNSExceptionAllowsInsecureHTTPLoads & NSIncludesSubdomains mit Wert bis YES.

Links

https://forums.developer.Apple.com/message/5857#5857

WWDC-Sitzung 2015 711

iOS 9 HTTP-Verbindungsfehler - StackOverflow

42
Antoine

Dies ist ein Vertrauensproblem. Bei einem selbstsignierten Zertifikat funktioniert die Identitätsprüfungskomponente von SSL nicht. Es ist immer noch möglich, eine sichere Verbindung herzustellen, damit niemand lauscht, aber die App kann nicht sicher sein, wer sich am anderen Ende der Leitung befindet.

Ich habe ein ähnliches Setup und habe dieses Problem behoben, indem ich meine selbstsignierte Stammzertifizierungsstelle zu den vertrauenswürdigen iPad-Zertifikaten hinzugefügt habe. Diese Stammzertifizierungsstelle wird zum Signieren aller anderen Entwicklungszertifikate verwendet. Dann muss ich nur dieses einzelne Stammzertifikat hinzufügen, wo immer SSL verwendet wird. Wenn Sie nur ein selbstsigniertes Zertifikat haben, das Sie direkt verwenden, können Sie das wahrscheinlich einfach hinzufügen.

Um das Zertifikat auf das Gerät (oder den Simulator) zu übertragen, habe ich die Datei auf meinem Webserver abgelegt. Dann öffnen Sie es einfach in Safari über normales HTTP. Die Einstellungen-App sollte geöffnet werden und Sie fragen, ob Sie dem Zertifikat vertrauen möchten.

Dies setzt natürlich voraus, dass dies nur für die Entwicklung gedacht ist und dass Ihr Produktionssystem über ein Zertifikat verfügt, das von einer bekannten Behörde signiert wurde (d. H. Eines, das in der Datenbank der Stammzertifizierungsstellen des Betriebssystems enthalten ist). Da die Aufforderung an Endbenutzer, Ihr selbstsigniertes Zertifikat zu installieren, nicht funktioniert.

20
Brian

Dies ist die einzige Lösung, die für mich funktioniert hat ... Geben Sie am Ende Ihrer AppDelegate.m-Datei den folgenden Code ein:

@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host
{
return YES;
}
@end

Vielen Dank für jc ivancevich article http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-Android-ios/

6
Anton P

(Bearbeiten - Ich habe das als 9814 falsch verstanden, abgelaufenes Zertifikat. Ich bin nicht sicher, wie ich das lösen soll, aber hoffentlich hilft meine Antwort dabei, in die richtige Richtung zu weisen.)

Sieht aus wie ein Zertifizierungsproblem, das sich von der üblichen Frage "Beliebige Ladevorgänge zulassen" unterscheidet.

Kurzer Auszug aus: Apple-Dokumentation - Anhang A: Allgemeine Fehler bei der Bewertung des Server-Vertrauens

NSOSStatusErrorDomain errSSLNoRootCert -9813

1
The Problem

versuchen Sie, die Sitzungsvariable zu ändern. Diese Änderung hilft mir

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
1
Margaret López

Das Ändern der info.plist hat auch bei mir funktioniert.

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