web-dev-qa-db-ja.com

iOS7で自己署名証明書のkCFStreamErrorDomainSSLエラーをバイパスする

自己署名証明書を持つHTTPSWebページをUIWebViewにロードしようとしています。 this one または this one のようなヒントを使用すると、iOS6で機能します。iOS7では同じことが機能しません。

リンク先のStackOverflowの質問にあるように、私はNSURLConnectionを使用して、最初に自己署名証明書を通過しようとしています。これはすべて、UIWebViewにURLを読み込もうとする前です。

IOS 7で同じことを試みると、次のエラーが発生します。

2014-02-12 16:00:08.367 WebView [24176:5307] NSURLConnection/CFURLConnection HTTPのロードに失敗しました(kCFStreamErrorDomainSSL、-9802)

2014-02-12 16:00:08.370 WebView [24176:70b] SSLエラーが発生し、サーバーへの安全な接続を確立できません。

これをiOS7で機能させるための回避策はありますか?現時点では、 最初の例 を使用しています。

11
Diego Barros

リンクをたどってください:

iWebView内-NSURLConnection/CFURLConnection HTTPロードに失敗しました(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

このメソッドをクラスに追加します。

-(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