Игнорирование ошибок SSL-сертификата с помощью NSURLConnection

Я использую [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)] для извлечения данных из веб-службы, но веб-сервер имеет сертификат, выданный самостоятельно, что приводит к появлению этой ошибки:

Ошибка SSL

Ошибка отображается с помощью:

NSAlert *a = [NSAlert alertWithError:error];
[a runModal];

Есть ли способ игнорировать эту ошибку и продолжать в любом случае?


person colincameron    schedule 13.03.2013    source источник
comment
возможный дубликат Игнорирование ошибок сертификата с помощью NSURLConnection   -  person paulmelnikow    schedule 14.03.2013
comment
Я подумал, что об этом уже спрашивали, и нашел и переименовал предыдущий вопрос. Надеюсь, это решит вашу проблему.   -  person paulmelnikow    schedule 14.03.2013
comment
Вы правы, это обман (хотя я не получил этого ответа, потому что искал sendAsynchronousRequest, поэтому этот вопрос касается именно этого метода).   -  person colincameron    schedule 14.03.2013
comment
Игнорирование ошибок SSL-сертификата с помощью NSURLConnection – лучше решить проблему, чем игнорировать ошибку (при условии, что это нетривиальная ошибка, например поддельный сертификат, а не сертификат с истекшим сроком действия). Если вы не собираетесь правильно использовать PKI и SSL, то зачем вообще его использовать?   -  person jww    schedule 06.08.2014


Ответы (2)


Следуя инструкциям в связанном вопросе, я определил фиктивный интерфейс для NSURLConnection:

@interface NSURLRequest (DummyInterface)
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host;
@end

И вызвал метод перед созданием запроса:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

Это подавило ошибку о том, что сертификат недействителен.

person colincameron    schedule 14.03.2013
comment
Разве это не частный API? - person Stavash; 24.07.2013
comment
Да, но мое приложение не в магазине приложений, а распространяется напрямую, поэтому мне не нужно беспокоиться об отказе. Конечно, я рискую изменить API в более поздних версиях OS X, так как это недокументировано. - person colincameron; 24.07.2013
comment
Круто, просто хотел убедиться - person Stavash; 25.07.2013
comment
Я рискую изменить API... - как насчет риска утечки и потери информации для любого, кто атакует? Вы рассказываете об этом своим клиентам? - person jww; 06.08.2014

Это может быть отклонено Apple. Используйте правильную реализацию NSConnectiondatadelegate:

посмотрите, как это обойти: ответ Stackoverflow на аналогичный вопрос

person Nikolay DS    schedule 20.06.2014
comment
Я не могу использовать метод NSURLConnectionDelegate, так как вызываю -sendAsynchronousRequest. Тем не менее, сейчас это спорный вопрос для моего приложения, поскольку я решил проблему, купив сертификат SSL для сервера. - person colincameron; 26.06.2014