it-swarm.com.de

Fehler beim HTTP-Laden von NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9802) in der https-Verbindung

In iOS 9 stelle ich eine Anfrage für die URL https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg unter Verwendung der grundlegenden 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];

Aber diesen Fehler bekommen

Fehlerdomäne = NSURLErrorDomain Code = -1200 "Ein SSL-Fehler ist aufgetreten und es kann keine sichere Verbindung zum Server hergestellt werden." UserInfo = {NSLocalizedDescription = Es ist ein SSL-Fehler aufgetreten, und es kann keine sichere Verbindung zum Server hergestellt werden., NSLocalizedRecoverySuggestion = Möchten Sie trotzdem eine Verbindung zum Server herstellen? 1200 "(null)" Userinfo = {_ kCFStreamPropertySSLClientCertificateState = 0, _kCFNetworkCFStreamSSLErrorOriginalValue = -9802, -9802 = _kCFStreamErrorCodeKey, _kCFStreamErrorDomainKey = 3, = kCFStreamPropertySSLPeerTrust, kCFStreamPropertySSLPeerCertificates = {type = unveränderlich, count = 3, WERTE = ( 0 : 1: 2: )}}, _KCFStreamErrorCodeKey = -9802, NSErrorFailingURLStringKey = https://s3.amazonaws.com/furniture.retailcatalog.us/ products/2061/6262u9665.jpg , NSErrorPeerCertificateChainKey = {type = unveränderlich, count = 3, Werte = ( 0: 1: 2: )}, NSErrorClientCertificateStateKey = 0, NSURLErrorFailingURLPeerTrustErrorKey =, NSError FailingURLKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg }

Obwohl dies eine https-Verbindung ist, erhalte ich diesen seltsamen Fehler. Kann mir jemand bitte Bescheid geben.

14
IronMan

Laut Apple tech note erfordert App Transport Security SHA-2. Die S3- (und CloudFront-) Zertifikate verwenden SHA-1, weshalb dieser Fehler auftritt. 

Die Problemumgehung besteht darin, die Variable NSExceptionRequiresForwardSecrecy auf false zu setzen. (Dies ist so lange, bis AWS zu SHA-2 wechselt ( bis 30. September 2015 )).

 SHA-1 Signature

27

Dies ist auch bei Amazon S3 aufgetreten. Leider kann ich Ihnen nicht sagen warum dies geschieht - S3 scheint die Vorwärtsgeheimnisanforderungen zu erfüllen ( zumindest entsprechend dieser Antwort ):

 Adams-MacBook-Pro: tmp Adam $ curl -kvI https://s3.amazonaws.com 
 * Umgestaltete URL zu: https://s3.amazonaws.com/
 * Versuch 54.231.32.128 ... 
 * Verbunden mit s3.amazonaws.com (54.231.32.128) Port 443 (# 0) 
 * TLS 1.2-Verbindung unter Verwendung von TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

Die Problemumgehung die ich hier gefunden habe besteht darin, der Info.plist-Datei Ihrer App eine Ausnahme hinzuzufügen, um keine Vorwärtsgeheimnis zu erfordern:

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

Soweit ich das beurteilen kann, ist dies der Mindestbetrag, um den Sie die integrierte Sicherheit reduzieren können, um eine Verbindung zu Amazon S3 herzustellen.

7
Adam S

Mit Hilfe der anderen Antworten und hier habe ich meine App, die eine Verbindung zu mehreren Cloudfront.net-Subdomains herstellen muss, mit diesem Zusatz zur Plist behoben:

        <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>
2
frankhermes

Für mich bestand die Lösung darin, diese Ausnahme für die Domäne hinzuzufügen:

<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>xxx.com</key>
        <dict>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
0
Arturo Marzo