web-dev-qa-db-fra.com

Échec du chargement HTTP de NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9802) erreur dans la connexion https

Dans iOS 9, je lance une requête pour l'URL https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg à l'aide de base de 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];

Mais avoir cette erreur

Error Domain = NSURLErrorDomain Code = -1200 "Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie." UserInfo = {NSLocalizedDescription = Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie., NSLocalizedRecoverySuggestion = Voulez-vous vous connecter quand même au serveur ?, _kCFStreamErrorDomainKey = 3, NSUnderlyingError = 0x7c1075e0 {Error Domain = kCFErr La dimension de la série = "C" )}}}, _kCFStreamErrorCodeKey = -9802, NSErrorFailingURLStringKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg , NSErrorPeerCertificateChainlist {} , values ​​= (0: 1: 2:)}, NSErrorClientCertificateStateKey = 0, NSURLErrorFailingURLPeerTrustErrorKey =, NSErrorFailingURLKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/626 2u9665.jpg }

Même s'il s'agit d'une connexion https, pourquoi cette erreur étrange me concerne-t-elle. Quelqu'un peut-il me faire savoir s'il vous plaît.

14
IronMan

Conformément à la note Apple tech , App Transport Security requiert SHA-2. Les certificats S3 (et CloudFront) utilisent SHA-1, raison pour laquelle cet échec se produit. 

La solution de contournement consiste à définir la NSExceptionRequiresForwardSecrecy sur false. (Jusqu'à ce que AWS passe à SHA-2 ( avant le 30 septembre 2015 )).

SHA-1 Signature

27
Stuart Breckenridge

J'ai rencontré cela avec Amazon S3 aussi. Malheureusement, je ne peux pas vous dire pourquoi cela se produit - S3 semble respecter les exigences de confidentialité ( du moins selon cette réponse ):

 Adams-MacBook-Pro: tmp Adam $ curl -kvI https: //s3.amazonaws.com
* URL reconstruite à l'adresse suivante: https://s3.amazonaws.com/
* Essai de 54.231.32.128 ...
 * Connecté à s3.amazonaws.com (54.231.32.128) port 443 (# 0) 
 * Connexion TLS 1.2 utilisant TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

La solution de contournement, que j'ai trouvée ici consiste à ajouter une exception au fichier Info.plist de votre application pour ne pas exiger le secret de transmission:

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

Autant que je sache, il s'agit du montant minimal que vous pouvez réduire la sécurité intégrée pour vous connecter à Amazon S3.

7
Adam S

Avec l'aide des autres réponses fournies ici et ici , j'ai corrigé mon application devant se connecter à plusieurs sous-domaines cloudfront.net avec cet ajout à la liste de sélection:

        <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

Pour moi, la solution consistait à ajouter cette exception pour le domaine:

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