NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9802) ошибка в соединении https

В iOS 9 я удаляю запрос для URL https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg, используя базовое NSURLConnection.

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];

Но получение этой ошибки

Ошибка домена = NSURLErrorDomain Code = -1200 "Произошла ошибка SSL и невозможно создать безопасное соединение с сервером". UserInfo = {NSLocalizedDescription = Произошла ошибка SSL и не удалось создать безопасное соединение с сервером. NSLocalizedRecoverySuggestion = Хотелось бы подключиться к серверу в любом случае?, _kCFStreamErrorDomainKey = 3, NSUnderlyingError = 0x7c1075e0 {Ошибка домена = kCFErrorDomainCFNetwork Code = - 1200 "(null)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0, _kCFNetworkCFStreamSSLErrorOriginalValue = -9802, _kCFStreamErrorCodeKey = -9802, _kCFStreamErrorDomainKey = 3, kCFStreamPropertySSLPeerTrust =, kCFStreamPropertySSLPeerCertificates = {type = immutable, count = 3, values ​​= (   0:   1:   2: )}}}, _kCFStreamErrorCodeKey = -9802, NSErrorFailingURLStringKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg, NSErrorPeerCertificateChainKey = {type = immutable, count = 3, values ​​= (   0:   1:   2: )}, NSErrorClientCertificateStateKey = 0, NSURLErrorFailingURLPeerTrustErrorKey =, NSErrorFailingURLKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg}

Хотя это соединение https, почему я получаю эту странную ошибку. Может кто-нибудь, пожалуйста, дайте мне знать.

Ответы

Ответ 1

В соответствии с Apple техническая заметка, для обеспечения безопасности приложений для приложений требуется SHA-2. Сертификаты S3 (и CloudFront) используют SHA-1, поэтому этот сбой происходит.

Обходной путь - установить NSExceptionRequiresForwardSecrecy в false. (Это пока AWS не переместится на SHA-2 (к 30 сентября 2015 г.))).

Подпись SHA-1

Ответ 2

Я столкнулся с этим и с Amazon S3. К сожалению, я не могу сказать вам, почему это происходит. S3, по-видимому, отвечает требованиям прямой секретности (по крайней мере в соответствии с этим ответом):

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

Обходной путь который я нашел здесь, заключается в добавлении исключения в файл вашего приложения Info.plist, чтобы не требовать прямой секретности:

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

Насколько я могу судить, это минимальная сумма, которую вы можете уменьшить встроенную защиту для подключения к Amazon S3.

Ответ 3

С помощью других ответов, представленных здесь, и здесь, я исправил свое приложение, которому необходимо подключиться к нескольким облачным облачным облачным доменам с этим добавлением к 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>

Ответ 4

Для меня решение заключалось в том, чтобы добавить это исключение для домена:

<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>xxx.com</key>
        <dict>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>