web-dev-qa-db-fra.com

Ignorer l'erreur kCFStreamErrorDomainSSL pour les certificats auto-signés sur iOS 7

J'essaie de charger une page Web HTTPS, qui possède un certificat auto-signé, dans un UIWebView. Utiliser des astuces telles que celle-ci ou celle-ci , elle fonctionne sous iOS 6. Il en va de même pour iOS 7.

Conformément aux questions liées au dépassement de pile, j'utilise également une connexion NSURLConnection pour essayer d'abord de contourner le certificat auto-signé - tout cela avant même d'essayer de charger l'URL dans UIWebView.

En essayant la même chose dans iOS 7, j'obtiens l'erreur suivante:

2014-02-12 16: 00: 08.367 WebView [24176: 5307] Le chargement HTTP de NSURLConnection/CFURLConnection a échoué (kCFStreamErrorDomainSSL, -9802)

2014-02-12 16: 00: 08.370 WebView [24176: 70b] Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie.

Existe-t-il une solution pour que cela fonctionne dans iOS 7? Pour le moment, j'utilise le premier exemple .

11
Diego Barros

S'il vous plaît suivez le lien:

dans UiWebView - Échec du chargement HTTP de NSURLConnection/CFURLConnection (kCFStreamErrorDomainSSL, -108)

BOOL _Authenticated;
NSURLRequest *_FailedRequest;
#pragma UIWebViewDelegate

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request   navigationType:(UIWebViewNavigationType)navigationType {
    BOOL result = _Authenticated;
    if (!_Authenticated) {
        _FailedRequest = request;
        NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        [urlConnection start];
    }
    return result;
}

#pragma NSURLConnectionDelegate

-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        NSURL* baseURL = [NSURL URLWithString:@"your url"];
        if ([challenge.protectionSpace.Host isEqualToString:baseURL.Host]) {
            NSLog(@"trusting connection to Host %@", challenge.protectionSpace.Host);
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
        } else
            NSLog(@"Not trusting connection to Host %@", challenge.protectionSpace.Host);
    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)pResponse {
    _Authenticated = YES;
    [connection cancel];
    [webvw loadRequest:_FailedRequest];
}
17
Manab Kumar Mal

Ajoutez cette méthode dans votre classe:

-(void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
    {
        NSURL* baseURL = [NSURL URLWithString:@"yourURL"];

        if ([challenge.protectionSpace.Host isEqualToString:baseURL.Host])
        {
            SecTrustRef trust = challenge.protectionSpace.serverTrust;

            NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
            [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
        }
        else
            NSLog(@"Not trusting connection to Host %@", challenge.protectionSpace.Host);
    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
0
Mohamad Chami