2014-09-18 24 views
14

Moja aplikacja po prostu łączy się z serwerem internetowym na urządzeniu domowym i czyta jakiś html. Działa to dobrze, gdy używasz http, ale teraz na iOS 8 podczas korzystania z https nie działa.iOS 8 zepsuł połączenie SSL w mojej aplikacji - nie powiodło się połączenie SSL SSLNetwork (-9806)

Używam AFNetworking v1 i przesłonię sprawdzenia SSL za pomocą tych metod nadpisywania (Tak, wiem, że w normalnych okolicznościach nie powinno się tego robić i jest niebezpieczne itp., Ale to inny temat).

[self setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) { 
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
     } 
    }]; 

[self setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace) { 
     if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
       return YES; // Self-signed cert will be accepted 
     } 
     // If no other authentication is required, return NO for everything else 
     // Otherwise maybe YES for NSURLAuthenticationMethodDefault and etc. 
     return NO; 
    }]; 

Teraz z iOS 8 pojawia się błąd jak poniżej:

CFNetwork SSLHandshake failed (-9806)

CFNetwork SSLHandshake failed (-9806)

CFNetwork SSLHandshake failed (-9806)

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806)

Error during connection: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo=0x7b66c110 {NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorCodeKey=-9806, NSErrorFailingURLStringKey= https://xxx.xxx.xxx.xxx:443/live.htm , _kCFStreamErrorDomainKey=3, NSUnderlyingError=0x7c0d8a20 "An SSL error has occurred and a secure connection to the server cannot be made.", NSErrorFailingURLKey= https://xxx.xxx.xxx.xxx:443/Info.live.htm }

Próbowałem zmiany na FSNetworking i IT sometimes prace przy tworzeniu tego:

- (void)connection:(NSURLConnection *)connection 
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 

    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     NSLog(@"Ignoring SSL"); 
     SecTrustRef trust = challenge.protectionSpace.serverTrust; 
     NSURLCredential *cred; 
     cred = [NSURLCredential credentialForTrust:trust]; 
     [challenge.sender useCredential:cred forAuthenticationChallenge:challenge]; 
     return; 
    } 
} 

jednak robi 2 jednoczesne żądanie, tylko 1 zakończy się pomyślnie, a jeden zakończy się niepowodzeniem z podobnym błędem do powyższego. Wydaje się, że tylko jedno żądanie osiąga punkt zastąpienia SSL.

Czy ktoś może rzucić trochę światła na to i co się zmieniło w iOS 8, aby to przełamać i jak mogę to naprawić?

Dzięki

+1

Oto lista kodów błędów, które obejmują Twój: http://www.opensource.apple.com/source/libsecurity_ssl/libsecurity_ssl-32463/lib/SecureTransport.h – eremzeit

Odpowiedz

2

Błąd widzisz można znaleźć w SecureTransport.h. Jest to błąd na poziomie transportu: połączenie nie powiodło się, ponieważ zostało przerwane.

Wiele rzeczy może być przyczyną zarówno na kliencie, jak i na serwerze. Jest to bardziej prawdopodobne, jeśli serwer prosi klienta o certyfikat, a klient go nie dostarcza, w którym to momencie serwer postanawia zrezygnować. Jeśli serwer żąda od klienta certyfikatu, metoda delegowana powinna widzieć prócz uwierzytelnienia przy użyciu certyfikatu klienta i zaufania serwera.

+1

Dzięki. Nie bardzo wiem, co zmieniło się z iOS 7 na 8, aby nagle przestało działać. Zaktualizowałem do wersji AFNetworking v2 i otrzymuję oddzwanianie w odpowiedzi na wezwanie do uwierzytelnienia i w zasadzie powiadam, żeby to ignorowało i kontynuowało. Wydaje się, że czasami działa, ale nie zawsze. Zastanawiam się, czy muszę ustawić kolejkę wszystkich żądań, więc tylko 1 idzie na raz? – Darren

+0

Wygląda na to, że rzeczywiście mam działającą stronę ssl. Mimo że otrzymuję komunikat SSLHandshake Failed, pomyślnie łączę się, pomijając ssl, jak w moim pytaniu. Powodem, dla którego to tylko czasami działa, myślę, że jest ze względu na to https://github.com/AFNetworking/AFNetworking/issues/2314#issuecomment-56664366 – Darren

9

wpadłem na tego samego rodzaju problem z iOS 8.

Scenariusz:

  1. apeluje do naszej pracy serwera https
  2. Otwórz URL https z naszego serwera w UIWebView
  3. Wszystkie przyszłe NSURLConnection s ulegają awarii z błędem SSLHandshake

useCredential:forAuthenticationChallenge powodował ten błąd (ale tylko po otwarciu strony w https hostowanej na tym samym serwerze), gdy zadzwoniliśmy ponownie do metod SecTrust *.

Kod ten wywołał błąd:

[challenge.sender useCredential:urlCredential forAuthenticationChallenge:challenge]; 
SecTrustRef trustRef = [[challenge protectionSpace] serverTrust]; 
CFIndex count = SecTrustGetCertificateCount(trustRef); 

Ale to nie:

SecTrustRef trustRef = [[challenge protectionSpace] serverTrust]; 
CFIndex count = SecTrustGetCertificateCount(trustRef); 
[challenge.sender useCredential:urlCredential forAuthenticationChallenge:challenge]; 

To nie jest dla mnie jasne, dlaczego to było przyczyną SSLHandshake niepowodzenie w iOS 8, ale nie iOS 7. Może AFNetworking robi coś po useCredential:forAuthenticationChallenge, co powoduje ten sam problem.

+1

Dzięki. To w zasadzie to samo, co powyżej. Myślę, że kod na dole mojego pytania faktycznie działa i powodem, dla którego czasami nie jest to związane z tym https://github.com/AFNetworking/AFNetworking/issues/2314#issuecomment-56664366 – Darren