web-dev-qa-db-fra.com

Échec du chargement HTTP NSURLConnection/CFURLConnection (kCFStreamErrorDomainSSL, -9813) iOS

Actuellement, je consomme un service Web soap avec block dans ios, mon code source est le suivant

NSString *xml = requestXMLToSent;

NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[xml length]];
NSURL *serviceURL = [NSURL URLWithString: url];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:serviceURL];

[urlRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[urlRequest addValue: serviceURL forHTTPHeaderField:@"SOAPAction"];
[urlRequest addValue:msgLength  forHTTPHeaderField:@"Content-Length"];
[urlRequest setHTTPBody: [xml dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPMethod:@"POST"];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {


    if (connectionError == NULL) {

        NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
        NSInteger statuscode = httpResponse.statusCode;
        if (statuscode == 200) {

            NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"response String  : %@",responseString);


        }else{
            NSLog(@"%@",response);

        }




    }else{

        NSLog(@"There is an error in URL connection and the Error is : %@",connectionError);
    }

Je reçois l'erreur suivante @ console 

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

Il y a une erreur dans la connexion d'URL et l'erreur est la suivante: Error Domain = NSURLErrorDomain Code = -1202 "Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être" www.xxxxxxxx.net ", ce qui pourrait mettre vos informations confidentielles à risque. " UserInfo = 0x10948bbb0 {NSUnderlyingError = 0x109470d10 "Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être« www.xxxxxx.net », ce qui pourrait compromettre vos informations confidentielles.", NSErrorFailingURLStringKey = https: // www .----------------------------------, NSErrorFailingURLKey = https: // ----- -------------------- NSLocalizedRecoverySuggestion = Souhaitez-vous vous connecter au serveur malgré tout ?, NSURLErrorFailingURLPeerTrustErrorKey =, NSLocalizedDescription = Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être «www.xxxxxx.net», ce qui pourrait mettre en péril vos informations confidentielles.}

Screenshot of error

9
Sumit Patel

Le serveur émetSSLcertificate error . À des fins de test, vous pouvez ajouter le code suivant à appDelegate: + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host { return YES; }

Cela contournera l'erreur SSL

Note: fonctionne pour NSURLConnection & UIWebView, mais pas pour WKWebView

Édité:

Pour iOS 9, la procédure ci-dessus ne fonctionne pas. Ajoutez l'extrait suivant dans info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
11
Shanu ji

Je suppose que vous utilisez le schéma https dans votre serviceURL et que votre serveur de test a des problèmes avec le certificat SSL. Si tel est le cas et que vous y avez confiance, implémentez les méthodes suivantes dans votre délégué NSURLConnection:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if([challenge.protectionSpace.Host isEqualToString:@"127.0.0.1"] /*check if this is Host you trust: */ )
       [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}

Pour qu'un délégué initialise votre NSURLConnection par exemple avec la méthode initWithRequest:delegate:startImmediately:.

8
user2260054

Dans iOS 9.0, ajoutez les éléments suivants à info.plist.

<key>NSAppTransportSecurity</key>  
     <dict>  
          <key>NSAllowsArbitraryLoads</key><true/>  
     </dict>  
1
amir

Vérifiez que vos délégués sont effectivement appelés.

Cette documentation explique que vos délégués peuvent ne pas être appelés dans certaines circonstances.

https://developer.Apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/AuthenticationChallenges.html

Important: Les classes système de chargement d'URL n'appellent pas leurs délégués pour gérer les demandes de requêtes, à moins que la réponse du serveur ne contienne un en-tête WWW-Authenticate. D'autres types d'authentification, tels que l'authentification proxy et la validation de confiance TLS, ne nécessitent pas cet en-tête.

0
user1951992