2016-03-31 6 views
17
gemacht werden kann

Ich bin immer mit selbst unterzeichnet folgende Fehler ZertifikatiOS 9.3: Ein SSL-Fehler aufgetreten ist und eine sichere Verbindung zum Server nicht

Fehler Domain = NSURLErrorDomain-Code = -1200 „Ein SSL-Fehler aufgetreten ist und eine sichere Verbindung zum Server nicht hergestellt werden kann.

während mit

  • iOS 9 für ein meine Demo-Anwendung Web-Service zu testen. 3
  • XCode 7,3
  • Swift 2,2
  • Alamofire 3.3.0
  • und lokale Server: https://filename.hostname.net

Hinweis:vor seiner doppelten vorausgesetzt, würde ich fordern Sie es den ganzen Weg lesen, auch gleiche ich an Apple dev Foren berichtet

Verwendung Alamofire Bibliothek


func testAlamofireGETRequest() -> Void 
    { 
     Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john") 
      .responseJSON 
     { response in 
      print("Response JSON: \(response.result.value)") 
     } 
} 

Mit NSURLSession


func testNSURLSessionRequest() -> Void { 

     let session = NSURLSession.sharedSession() 
     let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john" 
     let url = NSURL(string: urlString) 
     let request = NSURLRequest(URL: url!) 
     let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in 
      print("done, error: \(error)") 

      //Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made. 
     } 
     dataTask.resume() 
    } 

Ich verbrachte 2 Tage ohne Glück :(

gibt es Bündel von Fragen bereits gebucht, aber nichts für mich gearbeitet

Alamofire git Ausgabe

posted

Meine Info.pist Datei für ATS-Einstellungen auf diese Weise aktualisiert wird

//filename.hostname.net

und https:


Inzwischen Antwort für

http Ich bin in der Lage zu bekommen //google.com

aber nicht für https: //Dateiname.Hostname.net

Kann mir bitte jemand vorschlagen, warum ich nicht in der Lage, dies nach großen Anstrengungen arbeiten zu bekommen?

+0

Wie wäre es mit dem Betrachten des SSL-Handshakes? Kannst du Wireshark benutzen? – Greycon

+0

RDC, es funktionierte für mich: Die Antwort für mich ist: 'Erfolg:

Auth Key Missing!

'was perfekt ist, habe ich keine Header an meinen Server geliefert. Es arbeitet auf meiner Seite. check gist: https://gist.github.com/tush4r/142ba2a45bc9ed538dbe393be7ce36e2 – Fennec

Antwort

4

ich nehme an dem Server ungültige Zertifikate zu versuchen, eine Verbindung hat oder nicht übereinstimmt mit dem iOS 9 Standards für die ECC-up, Chiffren usw.

  • Wenn Sie mit High-Level-Networking-APIs-NSURLSession, NSURLConnection, oder irgendetwas auf der geschichteten diejenigen-Sie haben keine direkte Kontrolle über die Chiffre Suiten durch den Kunden angeboten. Diese APIs wählen eine Reihe von Chiffrier-Suites aus, die ihre eigene interne Logik verwenden.

  • Wenn Sie untergeordnete Netzwerk-APIs verwenden - CFSocketStream, über NSSStream und CFStream-APIs und alles, was darunter liegt - können Sie explizit den Satz von Chiffrier-Suites auswählen, den Sie verwenden möchten. Wie Sie dies tun, hängt von der spezifischen API ab.

Die gängige Praxis ist:

  1. das Paar Strom erzeugen

  2. configure es für TLS

  3. den sicheren Transport Kontext erhalten die kCFStreamPropertySSLContext Eigenschaft mit

  4. konfigur re spezifische Eigenschaften in diesem Zusammenhang

  5. öffnen die Ströme

Sie können ein Beispiel dafür in der TLSTool Beispielcode zu sehen. Sehen Sie sich speziell die Klasse TLSToolServer an, in der Sie genau diese Sequenz sehen können.

In sehr kurzen Zusammenhang mögen Sie den Strom so konfigurieren, dass sie die Sicherheit umgehen, aber im Fall von Alamofire Sie dies direkt tun können: me

func bypassAuthentication() { 
     let manager = Alamofire.Manager.sharedInstance 
     manager.delegate.sessionDidReceiveChallenge = { session, challenge in 
      var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling 
      var credential: NSURLCredential? 
      if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
       disposition = NSURLSessionAuthChallengeDisposition.UseCredential 
       credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) 
      } else { 
       if challenge.previousFailureCount > 0 { 
        disposition = .CancelAuthenticationChallenge 
       } else { 
        credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) 
        if credential != nil { 
         disposition = .UseCredential 
        } 
       } 
      } 
      return (disposition, credential) 
     } 
    } 

wissen lassen wenn das hilft. Vielen Dank!

+0

Wenn dies nicht der Fall ist, lassen Sie es mich wissen - ich werde Ihnen helfen, den Stream richtig zu konfigurieren, indem Sie die ECDHE TLS-Chiffrier-Suites deaktivieren. – Fennec

+0

Leider hat mir das nicht geholfen :(Ich habe den Fragepost auch aktualisiert. – swiftBoy

8

Apple hat die vollständige Anforderungsliste für die App Transport Security veröffentlicht.

Es stellte sich heraus, dass wir mit TLS v1.2 arbeiteten, aber einige der anderen Anforderungen fehlten.

Here's the full check list:

  • TLS benötigt mindestens Version 1.2.
  • Verbindung Chiffren für diejenigen beschränkt sind, die Vorwärtsgeheimhaltung bereitstellen (siehe unten für die Liste der Verschlüsselungen.)
  • Der Dienst erfordert ein Zertifikat mindestens eine SHA256 Fingerabdruck entweder mit einem 2048-Bit oder länger RSA-Schlüssel oder ein 256-Bit-Verwendung oder einen größeren Elliptic-Curve (ECC) Schlüssel.
  • Ungültige Zertifikate führen zu einem schwerwiegenden Fehler und zu keiner Verbindung.
  • Die akzeptierten Chiffren sind: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
+0

@ Cœur Hier ist es: [Link] (https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles /CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW57) – zvi

32

An der Befehlszeile in OS X, führen Sie die folgenden Schritte aus:

nscurl --ats-diagnostics https://filename.hostname.net --verbose

Dies wird Ihnen sagen, welche Kombinationen von ATS Einstellungen und wird Ich erlaube iOS nicht, auf Ihre Website zuzugreifen und sollte Sie darauf hinweisen, was mit Ihrer Website nicht stimmt.

Es könnte ein oder mehrere der folgenden

  • Zertifikat-Hash-Algorithmus (muss SHA-256 oder höher)
  • TLS Version sein (muss 1.2)
  • TLS-Algorithmen (muss liefern Perfekt Forward Secrecy)
+1

Wie von @ Codran erwähnt, hatte ich genau die gleiche Antwort und bekam es durch die erwähnte Methode umgangen. RDC, ich werde Ihre Situation auf einem lokalen Server neu erstellen und Sie dann informieren. – Fennec

+2

@codran, Für mich über Befehl zeigt "Ergebnis: PASS" für jeden Fall und ich habe auch ATS-Einstellungen in meinem info.plist hinzugefügt, aber manchmal sehe ich SSL-bezogene Probleme auf Crashytics. Irgendwelche Gedanken? – JiteshW

+0

@JiteshW genau mein Fall. Nichts, das unsichere Ladungen insgesamt erlaubt, funktioniert – Antek

2

Ich hatte das gleiche Szenario und blieb für einen Tag stecken. Versuchen Sie es mit Ihren mobilen Daten, wenn dies mit Ihrer API funktioniert, und dann mit Ihrer Netzwerkfirewall. Aktivieren Sie dann SSL/TLS aus den Firewall-Einstellungen.