Сведения о вопросе

FromRussia

12:48, 22nd August, 2020

Теги

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

Просмотров: 470   Ответов: 6

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

-1203, NSURLErrorDomain, bad server certificate

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

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

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

Есть какие-нибудь предложения по поводу того, что делать? Нужно ли мне использовать CFNetwork APIs, и если да, то два вопроса:

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

EDIT:

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



  Сведения об ответе

JUST___

00:43, 7th August, 2020

Поддерживаемый способ сделать это требует использования 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);


  Сведения об ответе

9090

16:23, 10th August, 2020

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


  Сведения об ответе

+-*/

19:23, 12th August, 2020

iPhone OS 3.0 представил поддерживаемый способ сделать это, который не требует более низкого уровня CFNetwork APIs. Подробнее здесь:

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


  Сведения об ответе

PIRLO

04:28, 10th August, 2020

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

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

Я процитирую Йенс Alfke :

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


  Сведения об ответе

FAriza

21:51, 13th August, 2020

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

Вас также может заинтересовать этот пост Re: Как справиться с плохой ошибкой сертификата в NSURLDownload


  Сведения об ответе

P_S_S

23:47, 22nd August, 2020

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

Я большой поклонник AsyncSocket, и он поддерживает самоподписанные сертификаты

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

Взгляните, я думаю, что он гораздо более надежен, чем стандартный NSURLRequests.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться