2016-03-31 9 views
17

otrzymuję następujący błąd z własnym podpisany certyfikatiOS 9.3: Błąd SSL wystąpiła i bezpieczne połączenie z serwerem nie mogą być wykonane

Błąd Domain = kod NSURLErrorDomain = -1200 „Wystąpił błąd SSL i bezpieczne połączenie z serwerem nie mogą być wykonane.

podczas testowania usługi sieci web dla jednego z mojej aplikacji demo z

Uwaga:przed objęciem jej duplikat, chciałbym zwrócić proszę przeczytać całą drogę, nawet sama mam zgłaszane forach jabłko dev

Używanie Alamofire Biblioteka


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

Korzystanie 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() 
    } 

Spędziłem 2 dni bez powodzenia :(

istnieje kilka pytań już wysłane, ale nic nie działało na mnie

pisał Alamofire git WYDANIE


Moja Info.pist plik jest aktualizowany do ustawień ATS tędy

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>filename.hostname.net</key> 
      <dict> 
       <key>NSExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
      </dict> 
     </dict> 
    </dict> 

Tymczasem jestem w stanie uzyskać odpowiedzi na

http: //filename.hostname.net

i https: //google.com

ale nie dla https: // nazwa_pliku.nazwa_hosta.netto

Czy ktoś może zasugerować mi, dlaczego nie jestem w stanie uzyskać tego działającego po wielkim wysiłku?

+0

Co powiesz na początek z uzgadnianiem SSL? Czy możesz użyć Wireshark? – Greycon

+0

RDC, To zadziałało dla mnie: Odpowiedź, którą otrzymałem, brzmi: 'SUCCESS:

Brakuje klucza autoryzacji!

'co jest idealne, nie dostarczyłem nagłówków do mojego serwera. Działa po mojej stronie. sprawdź istotę: https://gist.github.com/tush4r/142ba2a45bc9ed538dbe393be7ce36e2 – Fennec

Odpowiedz

4

przypuszczam serwer próbujesz połączyć ma nieważnych certyfikatów lub nie zgadza się z normami ECC iOS 9, Szyfry itp

  • Jeśli używasz wysokopoziomowych sieciowych API-NSURLSession, NSURLConnection lub cokolwiek warstwowa na tym, że nie ma bezpośredniej kontroli nad Cypher apartamentów oferowanych przez klienta. Te interfejsy API wybierają zestaw szyfrowanych pakietów przy użyciu własnej wewnętrznej logiki.

  • Jeśli korzystasz z interfejsów API niskiego poziomu - CFSocketStream, za pośrednictwem interfejsów API NSStream i CFStream, oraz wszystkiego, co jest niższe - możesz wyraźnie wybrać zestaw szyfratorów, których chcesz użyć. Sposób, w jaki to zrobisz, zależy od konkretnego API.

Standardowa praktyka:

  1. tworzyć pary strumień

  2. skonfigurować go dla TLS

  3. dostać Secure kontekst transportu przy użyciu właściwości kCFStreamPropertySSLContext

  4. configu re szczególnych właściwościach w tym kontekście

  5. otworzyć strumienie

można zobaczyć przykład to w przykładowym kodzie TLSTool. W szczególności spójrz na klasę TLSToolServer, gdzie można dokładnie zobaczyć tę sekwencję.

W bardzo krótkim kontekście chcesz skonfigurować strumienia w taki sposób, że omija zabezpieczenia, jednak w przypadku Alamofire można to zrobić bezpośrednio:

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

daj mi znać jeśli to pomaga. Dziękujemy!

+0

Jeśli to nie pomoże, daj mi znać - pomogę ci właściwie skonfigurować strumień, wyłączając pakiety cypherów ECDHE TLS. – Fennec

+0

Niestety to mi nie pomogło :(Zaktualizowałem również pytanie. – swiftBoy

8

Firma Apple opublikowała pełną listę wymagań dotyczących aplikacji App Transport Security.

Okazało się, że pracowaliśmy z TLS v1.2, ale brakowało niektórych innych wymagań.

Here's the full check list:

  • TLS wymaga co najmniej wersji 1.2.
  • szyfry przyłączeniowe są ograniczone do tych, które zapewniają naprzód tajności (patrz niżej na liście szyfrów.)
  • Usługa wymaga certyfikatu przy użyciu co najmniej odcisku palca SHA256 albo z 2048 bitów lub większej klucza RSA, lub 256bit lub większy klawisz Elipsa-Krzywa (ECC).
  • Nieprawidłowe certyfikaty powodują awarię i brak połączenia.
  • Przyjęte szyfrów są: 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 Oto ona: [Link] (https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles /CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW57) – zvi

32

Na linii poleceń w OS X, uruchom następujące:

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

to powie co kombinacje ustawień ATS i będzie Nie zezwalaj iOS na dostęp do Twojej witryny i wskaż, co jest nie tak z Twoją witryną.

Może to być jeden lub więcej z następujących

  • algorytm skrótu certyfikatu (musi być SHA-256 lub powyżej)
  • wersja TLS (musi być 1,2)
  • algorytmy TLS (musi zapewniają doskonałe forward Secrecy)
+1

Jak wspomniano w @Codran, miałem dokładnie tę samą odpowiedź i udało mi się ją ominąć za pomocą wspomnianej metody. RDC, ponownie utworzę twoją sytuację na lokalnym serwerze, a potem dam ci znać. – Fennec

+2

@codran, Dla mnie powyższe polecenie pokazujące "Wynik: PASS" dla każdego przypadku, a także dodałem ustawienia ATS w moim info.plist, Ale nadal widzę problemy związane z SSL w crashytics. jakieś pomysły? – JiteshW

+0

@JiteshW dokładnie w moim przypadku. Nic, poza zezwoleniem na niezabezpieczone ładunki, działa – Antek

2

Miałem ten sam scenariusz i utknąłem na jeden dzień. Spróbuj z komórkowymi danymi, jeśli to działa dobrze z twoim API, to problem z zaporą sieciową. następnie włącz SSL/TLS z ustawień zapory.

Powiązane problemy