2011-10-17 14 views
9

Mam aplikację, która używa ASIHTTPRequest.iOS 5: https (ASIHTTPRequest) przestał działać

I zrekompilowane mojej aplikacji z iOS 5 (SDK: 5.0/Xcode 4.2 Budowa 4D199) i połączeń HTTPS nie z komunikatem o błędzie (tego samego połączenia https prac niepełnosprawnych Fine):

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xa8e66e0 {NSUnderlyingError=0xa8ac6c0 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred} 

Z dziennika debugowania włączona:

[STATUS] Starting asynchronous request <ASIFormDataRequest: 0xd96fc00> 

[CONNECTION] Request <ASIFormDataRequest: 0xd96fc00> will not use a persistent connection 

[STATUS] Request <ASIFormDataRequest: 0xd96fc00>: Failed 

[CONNECTION] Request #(null) failed and will invalidate connection #(null) 

znalazłem ten powiązany wpis: https://devforums.apple.com/message/537440#537440 które mogłyby EXPL w moim problemie.

opiera się na założeniu, że iOS 5 wolą TLS 1.2, I spróbuj zmienić ustawienie na kCFStreamSocketSecurityLevelTLSv1 w AIHTTPRequest.m

NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], 
kCFStreamSSLAllowsExpiredCertificates, 
            [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
            [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
            kCFNull,kCFStreamSSLPeerName, 
             kCFStreamSocketSecurityLevelTLSv1, kCFStreamSSLLevel,// my modif 
            nil]; 

bez powodzenia. Może moja modyfikacja jest nieprawidłowa?

Szczegóły:

  • mam ARC wyłączone
  • używam libz.1.2.5.dylib
  • zaktualizowałem ASIHTTPRequest tydzień temu.

Nie wiem, czy problem jest historią certyfikatu (jak wersja TLS) czy czymś innym.

każda pomoc/pomysł jest mile widziany!

Odpowiedz

6

Oto Roztwór końcowy:

https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

 NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
             [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
             kCFNull,kCFStreamSSLPeerName, 
             @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
             nil]; 

Dodanie tego param:

         @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
+1

Zobacz także tę poprawkę: https://github.com/ignaval/asi-http-request/commit/c782abbeb204156d30ecbb902915d1eaf9b10f9e#comments - chcesz dodać właściwość do sprawy validateCertificate = YES również – ckhan

+0

Dla mnie zmiana @ ckhan była wymagane również zanim zadziała na 5.0 – leontx

+0

force 'kCFStreamSocketSecurityLevelTLSv1_2' działa również z tą metodą – ReDetection

1

Są to rzeczy, chciałbym spróbować:

  1. Pobierz nową kopię asihttprequest, umieścić go w nowo utworzonej bardzo prostej aplikacji, która po prostu sprawia, że ​​pojedynczy http i sprawdzić, czy zachowuje tę samą
  2. Try przeciwko innym serwerom https sprawdź, czy zachowujesz się tak samo (wypróbuj niektóre z wielkich nazw, np. https://twitter.com - linkedin, google, itp., wszystkie mają również wersje https)
  3. Wypróbuj ten sam serwer w Safari (wciąż na iOS urządzenie)

Co jest warte, mam ASIHTTPRequest na iOS5, który działa dobrze z serwerami https mojego klienta - nie musiałem wprowadzać żadnych zmian w systemie iOS5.

+0

dzięki za wskazówki. Nr 1: bez zmian; # 2: inna strona działa dobrze. ; # 3: w przeglądarce macierzystej strona wyświetla się zgodnie z oczekiwaniami. ; Czy możesz być na tyle uprzejmy, aby powiedzieć mi, z wersją TLS, z której korzysta twój serwer klienta, gdy zostanie wywołana z Twojej aplikacji? – Loda

+0

Nie jestem uczciwie pewien; czy wiesz, jak sprawdziłbym? Z dotychczasowych dowodów wydaje mi się, że jest to ten sam problem z TLSv1.2, co link opublikowany na forach Apple - może powinieneś opublikować tam swój kod i mieć nadzieję, że Quinn będzie mógł rzucić okiem? – JosephH

+0

, jak się obawiałem i jak sugerowałeś, może to być problem związany z serwerem. Więc nie jestem pewien, jak mogę to zadać na forum (NDA). W jaki sposób, jeśli wersja TLS stanowi problem, dlaczego moja modyfikacja go nie naprawi? ... Dzięki za pomoc, cieszę się, że nie jest to ogólny problem z ASIHTTPRequest/iOS5. – Loda

1

Spróbuj użyć kCFStreamSocketSecurityLevelSSLv3 zamiast TLSv1. To zadziałało, gdy wpadłem na podobną sytuację.Nie jestem pewien, dlaczego auto-negocjacja nie wraca do właściwego protokołu, ale przynajmniej na niektórych serwerach wydaje się, że nie działa pod ASIHttpRequest, gdzie działałoby z NSURLConnection.

6

Na naszej konfiguracji problem został rozwiązany przez wprowadzenie

[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel]; 

tuż nad

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties); 

w sekcji Ustawienia certyfikatu Uchwyt SSL.

Edycja: Według http://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309 dodaje powinna być bardziej wytrzymała

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel]; 
+0

Dzięki za rozwiązanie. Działa to dla mojej aplikacji na iPhone'a, ale kiedy umieszczam tę samą linię w moim ASIHTTPRequest na iPadzie, to nie działa. Jakie może być możliwe rozwiązanie? Dziękuję Ci. :) – Akshay

+0

Odkąd odpowiedziałem na to pytanie, ASI przestało obsługiwać ASIHTTPRequest i zacząłem używać AFNetworking https://github.com/AFNetworking/AFNetworking. – weibel

Powiązane problemy