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.
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 )).
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.
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>
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>