2015-08-25 12 views
14

W systemie iOS 9, wybieram żądanie dla adresu URL https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg przy użyciu podstawowego NSURLConnection.NSURLSession/NSURLConnection Błąd ładowania HTTP (kCFStreamErrorDomainSSL, -9802) błąd w połączeniu https

NSOperationQueue *completionQueue = [NSOperationQueue mainQueue]; 
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    self.mURLSession = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:completionQueue]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg"]]; 
    NSURLSessionDataTask *dataTask = [self.mURLSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSLog(@"%@",error); 
    }]; 
    [dataTask resume]; 

Ale otrzymuję ten błąd

Error Code NSURLErrorDomain Domain = -1200 = "Błąd SSL wystąpiła i bezpieczne połączenie z serwerem nie mogą być wykonane." UserInfo = {NSLocalizedDescription = Wystąpił błąd SSL i nie można nawiązać bezpiecznego połączenia z serwerem., NSLocalizedRecoverySuggestion = Czy mimo to chcesz połączyć się z serwerem ?, _kCFStreamErrorDomainKey = 3, NSUnderlyingError = 0x7c1075e0 {Domena błędu = kCFErrorDomainCFNetwork Code = - 1200 "(zerowy)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0 _kCFNetworkCFStreamSSLErrorOriginalValue = -9802, _kCFStreamErrorCodeKey = -9802, _kCFStreamErrorDomainKey = 3, kCFStreamPropertySSLPeerTrust =, kCFStreamPropertySSLPeerCertificates = {type = niezmienna liczyć = 3, wartość = ( 0: 1: 2: )}}} _kCFStreamErrorCodeKey = -9802, NSErrorFailingURLStringKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg, NSErrorPeerCertificateChainKey = {type = niezmienna liczyć = 3, wartość = ( 0: 1:)}, NSErrorClientCertificateStateKey = 0, NSURLErrorFailingURLPeerTrustErrorKey =, NSErrorFailingURLKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg}

Mimo że jest to połączenie https, dlaczego otrzymuję ten dziwny błąd. Czy ktoś może proszę dać mi znać.

+0

Nie jestem zbyt dobrze poinformowany o tym problemie, ale uważam, że posiadanie HTTPS nie wystarczy na iOS 9 - twoje połączenie musi również korzystać z co najmniej TLS 1.2.Możesz odwiedzić Google i znaleźć usługę, która powie ci, czy masz to na tym serwerze. To był powód tego błędu, gdy zobaczyłem go jakiś czas temu. –

Odpowiedz

27

Zgodnie z wymaganiami Apple tech note aplikacja App Transport Security wymaga SHA-2. Certyfikaty S3 (i CloudFront) używają SHA-1, dlatego występuje ta awaria.

Obejście polega na ustawieniu wartości NSExceptionRequiresForwardSecrecy na false. (Dzieje się tak, dopóki AWS nie przejdzie do SHA-2 (by September 30th, 2015)).

SHA-1 Signature

+0

nadal nie działa żadna inna sugestia? –

+0

Wystąpił ten błąd: Aplikacja Transport Security zablokowała ładowanie jawnego ładunku HTTP (http: //), ponieważ jest niezabezpieczony. Tymczasowe wyjątki można skonfigurować za pomocą pliku Info.plist aplikacji. –

+0

Dodaj domenę wyjątków w "Ustawieniach zabezpieczeń aplikacji do transportu" w "info.plist". –

6

Napotkałem to również w usłudze Amazon S3. Niestety, nie mogę powiedzieć dlaczego tak się dzieje - S3 wydaje się spełniać wymogi tajemnicy forward (at least according to this answer):

 
Adams-MacBook-Pro:tmp Adam$ curl -kvI https://s3.amazonaws.com 
* Rebuilt URL to: https://s3.amazonaws.com/ 
* Trying 54.231.32.128... 
* Connected to s3.amazonaws.com (54.231.32.128) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

Rozwiązaniem, which I found here jest dodanie wyjątek Info.plist złożyć aplikacji nie wymagają tajności przodu:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>s3.amazonaws.com</key> 
     <dict> 
      <key>NSExceptionRequiresForwardSecrecy</key> 
      <false/> 
     </dict> 
    </dict> 
</dict> 

O ile mi wiadomo, jest to minimalna ilość można zmniejszyć wbudowane zabezpieczenia w celu podłączenia do Amazon S3.

2

z pomocą innych odpowiedzi dostarczonych tutaj i here, naprawiłem moją aplikację, która musi łączyć się wielu subdomen cloudfront.net z tym oprócz plist:

 <key>NSAppTransportSecurity</key> 
     <dict> 
      <key>NSExceptionDomains</key> 
      <dict> 
       <key>cloudfront.net</key> 
        <dict> 
        <!--Include to allow subdomains--> 
        <key>NSIncludesSubdomains</key> 
        <true/> 
        <key>NSExceptionRequiresForwardSecrecy</key> 
        <false/> 
       </dict> 
      </dict> 
     </dict> 
0

Dla mnie rozwiązaniem było dodanie tego wyjątku dla domeny:

<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>xxx.com</key> 
     <dict> 
      <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 
Powiązane problemy