2017-01-19 15 views
0

Я некоторое время пытаюсь доверять сертификату, используя NSURLSession, поскольку вариант NSURLConnection устарел от macOS 10.11. Я пытаюсь реализовать NSURLSession в приложении на основе WebKit, и после того, как сертификат доверен, ничего не происходит, и если я перезагружаю веб-страницу, на консоли появляется такая же ошибка, говоря, что сертификату не доверяют.Доверяя недействительный сертификат с NSURLSession

Мой код выглядит следующим образом:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[defaults objectForKey:@"lastSession"]]]; 

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSLog(@"Success"); 
}]; 

[dataTask resume]; 

Вот что у меня есть для метода didReceiveChallenge:

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { 
    NSLog(@"Received auth challenge"); 
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     NSURL *baseURL = [NSURL URLWithString:[defaults objectForKey:@"lastSession"]]; 
     if([challenge.protectionSpace.host isEqualToString:baseURL.host]) { 
      NSLog(@"Trusting connection to host %@", challenge.protectionSpace.host); 
      NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
      [challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; 
      completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 
      NSLog(@"Trusted webpage successfully"); 
     } 
    } 
} 

Есть ли что-то я здесь отсутствует? Некоторая помощь определенно будет оценена ...

ответ

0

Вы не должны ничего называть вызовом.sender при работе с NSURLSession. Просто вызовите обработчик завершения. Однако вы также не должны получать сертификат из запроса, потому что в основном вы полностью отключите всю защиту для этого имени хоста, когда вы это сделаете.

Вместо этого вы должны жестко закодировать анкерный сертификат в своем приложении и добавить его в список доверенных якорей. Затем используйте этот якорный сертификат для подписи сертификата вашего сервера, и ваше приложение будет доверять этому серверу с этого момента.

Подробнее см. https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html

 Смежные вопросы

  • Нет связанных вопросов^_^