Синхронное соединение SSL Objective-C - PullRequest
4 голосов
/ 21 апреля 2010

Я немного новичок в объективе C, но столкнулся с проблемой, которую не могу решить, в основном из-за того, что не уверен, что правильно внедряю решение.

Я пытаюсь подключиться с помощью синхронного подключения к сайту https с самозаверяющим сертификатом. Я получаю

Ошибка домена = NSURLErrorDomain Code = -1202 «сертификат ненадежного сервера»

Ошибка, что я видел некоторые решения на этом форуме. Решение, которое я нашел, было добавить:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];  
}  

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];  

}

в NSURLDelegate для принятия всех сертификатов. Когда я подключаюсь к сайту, использую только:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];  
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

Работает отлично, и я вижу, что вызов принят. Однако, когда я пытаюсь установить соединение, используя синхронное соединение, я все равно получаю сообщение об ошибке и не вижу вызывающих функций, вызываемых при ведении журнала.

Как получить синхронное соединение для использования методов вызова? Это как-то связано с делегатом: собственной частью URLConnection? У меня также есть регистрация для отправки / получения данных в NSURLDelegate, который вызывается моей функцией соединения, но не синхронной функцией.

Что я использую для синхронной части:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]];  
        [request setHTTPMethod: @"POST"];  
        [request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]];  
        dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
        NSLog(@"%@", error);  
        stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];  
        NSLog(@"%@", stringReply);  
        [stringReply release];  
        NSLog(@"Done"); 

Как я уже говорил, я немного новичок в цели C, так что будьте добры:)

Спасибо за любую помощь. Mike

1 Ответ

7 голосов
/ 21 апреля 2010

Согласно Apple Docs ( Руководство по программированию системы загрузки URL ), синхронный метод NSURLRequest не рекомендуется, потому что "потому что он имеет серьезные ограничения". Может показаться, что одним из этих ограничений является отсутствие возможности контролировать, какие сертификаты являются приемлемыми.

И да, вы правы, именно delegate:self в настройке NSURLConnection вызывает ваши методы делегата. Поскольку простой (или упрощенный) синхронный вызов sendSynchronousRequest: не позволяет указать делегата, эти методы делегата не используются.

...