Objective-C / Какао: Как я могу принять плохой сертификат сервера? - PullRequest
8 голосов
/ 19 августа 2008

Используя NSURLRequest , я пытаюсь получить доступ к веб-сайту с просроченным сертификатом. Когда я отправляю запрос, мое соединение: didFailWithError метод делегата вызывается со следующей информацией:

-1203, NSURLErrorDomain, bad server certificate

Мои поиски нашли только одно решение: скрытый метод класса в NSURLRequest:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

Однако я не хочу использовать частные API в производственном приложении по понятным причинам.

Есть предложения, что делать? Нужно ли использовать API-интерфейсы CFNetwork, и если да, то два вопроса:

  • Какой-нибудь пример кода, который я могу использовать, чтобы начать? Я не нашел ни одного онлайн.
  • Если я использую CFNetwork для этого, должен ли я полностью отказаться от NSURL?

EDIT:

iPhone OS 3.0 представила поддерживаемый метод для этого. Подробнее здесь: Как использовать NSURLConnection для соединения с SSL для ненадежного сертификата?

Ответы [ 6 ]

8 голосов
/ 29 октября 2008

Поддерживаемый способ сделать это требует использования CFNetwork. Вы должны сделать это присоединить kCFStreamPropertySSLSettings к потоку, который определяет kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse. Ниже приведен некоторый быстрый код, который делает это, за исключением проверки правильности результатов и очистки. После этого вы можете использовать CFReadStreamRead () для получения данных.

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);    
CFReadStreamOpen(myStream);
3 голосов
/ 19 октября 2008

Если это для внутреннего сервера в целях тестирования, почему бы просто не импортировать сертификат тестового сервера в KeyChain и установить пользовательские параметры доверия?

2 голосов
/ 04 февраля 2010

iPhone OS 3.0 представила поддерживаемый способ сделать это, не требующий низкоуровневых API-интерфейсов CFNetwork. Подробнее здесь:

Как использовать NSURLConnection для соединения с SSL для ненадежного сертификата?

1 голос
/ 21 августа 2008

Можно ли создать самозаверяющий сертификат и добавить свой пользовательский центр сертификации в доверенные центры сертификации? Я не совсем уверен, как это будет работать на iPhone, но я предполагаю, что на Mac OS X вы добавите их в связку ключей.

Возможно, вас также заинтересует этот пост Re: Как обработать неверную ошибку сертификата в NSURLDownload

1 голос
/ 19 августа 2008

Я столкнулся с той же проблемой - я разрабатывал клиент SOAP, и у сервера dev есть «доморощенный» сертификат. Я не смог решить проблему, даже используя этот метод, так как я не использовал NSURL, но (плохо документированные и явно заброшенные) методы WS, и решил пока (внутренне) просто использовать не-SSL подключение.

Сказав это, однако, возникает вопрос: если вы не хотите использовать частный API в производственном приложении, следует ли вам разрешить доступ к сайту с хитрым сертификатом?

Я процитирую Йенс Альфке :

Это не просто теоретическая проблема безопасности. Что-то
как 25% общедоступных DNS-серверов были взломаны, согласно
последние отчеты и могут направлять пользователей на фишинговые / вредоносные / рекламные сайты даже
если они правильно вводят доменное имя. Единственное, что защищает тебя
отсюда проверка SSL-сертификата.

0 голосов
/ 21 ноября 2008

Другим вариантом будет использование альтернативной библиотеки подключений.

Я большой поклонник AsyncSocket, и у него есть поддержка самозаверяющих сертификатов

http://code.google.com/p/cocoaasyncsocket/

Посмотрите, я думаю, что это намного надежнее, чем стандартные запросы NSURL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...