Есть ли способ позволить пользователю выбирать, доверять ли сайту, когда мы пытаемся использовать NSURLConnection для соединения с SSL для ненадежного сертификата?

Есть похожий вопрос по переполнению стека.

Вот мой код, который в любом случае примет сертификат недоверенного сервера.

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)space
{
    //We can always attempt to authenticate...
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
        [[challenge sender] useCredential:[NSURLCredential credentialForTrust:[[challenge protectionSpace] serverTrust]] forAuthenticationChallenge:challenge];
    } else {
      // Other situation
    }
}

Тем не менее, я хочу представить альтернативное представление, чтобы позволить пользователю выбрать, доверять ли сайту.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:
[[challenge protectionSpace]host] message:@"Do you trust this site?" 
delegate:self cancelButtonTitle:@"No" 
otherButtonTitles:@"Yes", @"Just once", nil];

[alert show];

Как я могу это сделать?

1 ответ

В качестве примера вы можете сохранить объект вызова в свойстве, а затем реализовать метод alertView:clickedButtonAtIndex: делегат, как этот (это для "доверять только один раз"):

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == alertView.cancelButtonIndex)
    {
        [[self.challenge sender] cancelAuthenticationChallenge:self.challenge];
    }
    else
    {
        [self.challenge.sender useCredential:[NSURLCredential credentialForTrust:self.challenge.protectionSpace.serverTrust] forAuthenticationChallenge:self.challenge];
        self.challenge = nil;
    }
}

Если вы хотите всегда доверять, вам нужно будет сделать несколько более сложных вещей, чтобы сохранить и сравнить данные сертификата сервера. Или сделайте его простым и небезопасным, сохранив, что URL-адрес сервера всегда должен быть доверенным, что делает вас уязвимым для человека в промежуточных атаках.

Другие вопросы по тегам