У меня есть следующий простой код для подключения к веб-странице SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
За исключением того, что выдает ошибку, если сертификат является самозаверяющим. Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Есть ли способ настроить его на принятие соединений в любом случае (как в браузере, который вы можете нажать «Принять») или способ обойти его?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Метод должен быть использован вместо.Если вы не желаете (или не можете) использовать частные API, есть библиотека с открытым исходным кодом (лицензия BSD) ASIHTTPRequest, которая предоставляет оболочку для нижнего уровня
CFNetwork APIs
. Недавно они представили возможность разрешатьHTTPS connections
использование самозаверяющих или ненадежных сертификатов с-setValidatesSecureCertificate:
API. Если вы не хотите загружать всю библиотеку, вы можете использовать источник в качестве справочного материала для самостоятельной реализации той же функциональности.источник
В идеале, должно быть только два сценария, когда приложению iOS потребуется принять ненадежный сертификат.
Сценарий А. Вы подключены к тестовой среде, в которой используется самозаверяющий сертификат.
Сценарий Б. Вы используете прокси-
HTTPS
трафик с помощьюMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
Прокси-сервер возвращает сертификат, подписанный самозаверяющим центром сертификации, чтобы прокси-сервер мог захватыватьHTTPS
трафик.Производственные хосты никогда не должны использовать недоверенные сертификаты по очевидным причинам .
Если вам нужно, чтобы симулятор iOS принимал недоверенный сертификат для тестирования, настоятельно рекомендуется не изменять логику приложения, чтобы отключить встроенную проверку сертификата, предоставляемую
NSURLConnection
API-интерфейсами. Если приложение будет выпущено для публики без удаления этой логики, оно будет подвержено атакам «человек посередине».Рекомендуемый способ принять недоверенные сертификаты для тестирования - это импортировать сертификат центра сертификации (CA), который подписал сертификат, на симуляторе iOS или устройстве iOS. Я написал краткое сообщение в блоге, которое демонстрирует, как это сделать с помощью симулятора iOS:
прием ненадежных сертификатов с помощью симулятора ios
источник
NSURLRequest
имеет закрытый методsetAllowsAnyHTTPSCertificate:forHost:
, который будет делать именно то, что вы хотите. Вы можете определитьallowsAnyHTTPSCertificateForHost:
методNSURLRequest
через категорию и настроить его на возвратYES
для хоста, который вы хотите переопределить.источник
Чтобы дополнить принятый ответ, для большей безопасности вы можете добавить свой сертификат сервера или свой собственный сертификат корневого центра сертификации в цепочку для ключей ( https://stackoverflow.com/a/9941559/1432048 ), однако выполнение одного этого не сделает NSURLConnection аутентифицируйте свой самоподписанный сервер автоматически. Вам все еще нужно добавить приведенный ниже код к вашему делегату NSURLConnection, он скопирован из примера кода Apple AdvancedURLConnections , и вам нужно добавить два файла (Credentials.h, Credentials.m) из примера кода Apple в ваши проекты.
источник
Я не могу взять кредит на это, но этот, который я нашел, работал очень хорошо для моих нужд.
shouldAllowSelfSignedCert
мояBOOL
переменная Просто добавьте к своемуNSURLConnection
делегату, и вы должны быть готовы к быстрому обходу для каждого соединения.источник
В iOS 9 соединения SSL не будут установлены для всех недействительных или самозаверяющих сертификатов. Это поведение по умолчанию новой функции App Transport Security в iOS 9.0 или более поздней версии , а также в OS X 10.11 и более поздней версии.
Вы можете переопределить это поведение в
Info.plist
, установивNSAllowsArbitraryLoads
дляYES
вNSAppTransportSecurity
словаре. Однако я рекомендую переопределить этот параметр только для целей тестирования.Для получения информации см. App Transport Technote здесь .
источник
Временное решение для категории, опубликованное Натаном де Врисом, пройдет частные проверки API-интерфейса AppStore и будет полезно в тех случаях, когда у вас нет контроля над
NSUrlConnection
объектом. Одним из примеров является то,NSXMLParser
что откроет предоставленный вами URL, но не раскрываетNSURLRequest
илиNSURLConnection
.В iOS 4 обходной путь все еще работает, но только на устройстве Simulator больше не вызывает
allowsAnyHTTPSCertificateForHost:
метод.источник
Вы должны использовать,
NSURLConnectionDelegate
чтобы разрешить HTTPS-соединения, и есть новые обратные вызовы с iOS8.Запрещены:
Вместо этого вам нужно объявить:
С помощью
willSendRequestForAuthenticationChallenge
вы можете использовать,challenge
как вы сделали с устаревшими методами, например:источник
Я опубликовал некоторый основной код (основанный на чьей-либо работе, который я отмечаю), который позволяет вам правильно проходить аутентификацию на основе сгенерированного сертификата (и как получить бесплатный сертификат - см. Комментарии внизу Cocoanetics )
Мой код здесь github
источник
Если вы хотите продолжать использовать sendSynchronousRequest, я работаю в этом решении:
Вы можете увидеть это здесь: Синхронное соединение SSL Objective-C
источник
С AFNetworking я успешно использовал веб-сервис https с кодом ниже,
источник
Вы можете использовать этот код
Используйте
-connection:willSendRequestForAuthenticationChallenge:
вместо этих устаревших методовЗапрещены:
источник