Синхронное соединение SSL Objective-C
Я немного новичок в Objective-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, так что будьте добры:)
Спасибо за любую помощь. Майк
1 ответ
Согласно Apple Docs ( Руководство по программированию системы загрузки URL), синхронный метод NSURLRequest не рекомендуется, потому что "потому что он имеет серьезные ограничения". Казалось бы, отсутствие способности контролировать, какие сертификаты являются приемлемыми, является одним из этих ограничений.
И да, вы правы, это delegate:self
на NSURLConnection
установка, которая вызывает ваши методы делегата для вызова. Потому что простой (или упрощенный) синхронный sendSynchronousRequest:
call не предоставляет способ указать делегата, эти методы делегата не используются.