Кто-нибудь нашел способ загрузить HTTPS-страницы с недопустимым сертификатом сервера с помощью UIWebView?

Если пользователь пытается загрузить веб-страницу https в Mobile Safari, и проверка проверки сертификата сервера завершается с ошибкой (ее истек, отозвана, самозапись и т.д.), тогда пользователь представлен с предупреждающим сообщением и спрашивает, если они хотите продолжить или нет.

Аналогично NSURLConnection предлагает разработчику возможность сначала решить, как проверить сертификат, а затем решить, как действовать, если он не работает, поэтому в этой ситуации также можно будет отобразить предупреждение пользователю и предложить им возможность продолжить загрузку страницы или нет.

Однако при загрузке https-страницы в UIWebView, которая не проверяет сертификат, поведение просто для того, чтобы не загружать страницу - didFailLoadWithError: получает вызов с помощью kCFURLErrorServerCertificateUntrusted, однако ничего не отображается пользователю.

Это непоследовательно - неужели поведение UIWebView должно вести себя аналогично тому, как Safari будет соответствовать самому iPhone? Кроме того, это глупое, что NSURLConnection позволяет обеспечить полную гибкость с этим еще NSURLRequest: setAllowsAnyHTTPSCertificate является закрытым.

В любом случае, чтобы реализовать поведение, совместимое с Safari, можно ли настроить это поведение по умолчанию аналогично NSURLConnection?

Приветствия

P.S. Пожалуйста, воздержитесь от участия в покровительстве сторонних дискуссий о том, почему кто-то хочет это сделать, большое спасибо.

Ответ 1

Я узнал, как это сделать:

1) Когда страница загружена, она не будет выполнена, добавив что-то вроде следующего: didFailLoadWithError:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
    if ([error.domain isEqualToString: NSURLErrorDomain])
    {
        if (error.code == kCFURLErrorServerCertificateHasBadDate        ||
            error.code == kCFURLErrorServerCertificateUntrusted         ||
            error.code == kCFURLErrorServerCertificateHasUnknownRoot    ||
            error.code == kCFURLErrorServerCertificateNotYetValid)
        {
        display dialog to user telling them what happened and if they want to proceed

2) Если пользователь хочет загрузить страницу, вам необходимо подключиться с помощью NSURLConnection:

NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL     cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
self.loadingUnvalidatedHTTPSPage = YES;
[self.webView loadRequest:requestObj];

3) Затем сделайте это изменение в shouldStartLoadWithRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{
    if (self.loadingUnvalidatedHTTPSPage)
    {
        self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        [self.connection start];
        return NO;
    }

4) Внедрите NSURLConnectionDelegate как:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    NSURLCredential *cred;
    cred = [NSURLCredential credentialForTrust:trust];
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
{
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
    self.loadingUnvalidatedHTTPSPage = NO;
    [self.webView loadRequest: requestObj];
    [self.connection cancel];
}

Все работает нормально.

Ответ 2

Из устья лошади:

"UIWebView не предоставляет никакого приложения для настройки своих оценок доверия к HTTPS-серверу. Это ограничение можно обойти с использованием общедоступных API-интерфейсов, но это непросто. Если вам нужно это сделать, обратитесь к разработчику Technical Поддержка ([email protected])

Источник: http://developer.apple.com/library/ios/#technotes/tn2232/_index.html