2012-01-13 1 views
25

Я внедряю веб-сайт в UIWebView. Во время разработки я указал на localhost. Проблема в том, что всякий раз, когда он попадает на URL-адрес «https: //», он не загружается. Когда я загружаю URL в мобильном сафари я получаю это всплывающее окно:Разрешить непроверенный сертификат ssl в UIWebview

enter image description here

Есть ли способ, чтобы изменить это с UIWebView, чтобы непроверенный URL?

ответ

8

Ответ Ника не позволит вашему приложению принять Apple в App Store, и ответ Джорджа не сможет загрузить оставшуюся часть страницы с .css или .js или любыми другими вторичными загрузками. Существует полный ответ here, который позволяет UIWebView загружать страницы с сайта с ненадежным сертификатом.

+4

+1, я просто отклонил свое приложение из-за использования «private api» (допускает метод AnyHTTPSCertificateForHost). – Yanchi

+1

Я дважды упомянул в своем ответе, что это решение должно использоваться только для тестирования. В любом случае, указывая свое живое приложение на HTTPS-сервере с ненадежным сертификатом, он обеспечивает нулевую безопасность, поэтому вы можете просто использовать HTTP вместо этого. –

56

Если это только для тестирования в процессе разработки вы можете создать категорию на NSURLRequest и переопределить следующий частный метод:

#if DEBUG 

@implementation NSURLRequest (NSURLRequestWithIgnoreSSL) 

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 

@end 

#endif 

Просто поместите это где-нибудь в одном из ваших .m файлов (например, приложение делегата), или поместите его в собственный файл .m. Вам не нужен соответствующий файл заголовка.

#if DEBUG является обязательным условием для предотвращения случайного оставления его при отправке в Apple, но если вам нужно, чтобы он работал в сборке релиза, удалите его (и убедитесь, что вы не забыли его восстановить или удалить эту категорию перед тем, как отправить в Apple).

+0

Могу ли я добавить список доверенных хостов там, чтобы проверить против? –

+0

Вы можете поместить любую логику в нужную вам функцию. Вы можете сравнить параметр хоста с массивом доверенных хостов и вернуть только ДА, если он соответствует. Но я действительно не вижу смысла, если это только для целей тестирования - помните, что вы не можете отправить приложение с этим кодом (если вы не хотите рисковать и надеетесь, что Apple не заметит). –

+2

Это решение не работает для меня. Когда я пишу это в свой код, приложение действительно игнорирует ошибку, связанную с сертификатами безопасности, но не завершает загрузку страницы. Я не уверен, что он делает. Я настроил NSLogs во всех связанных методах, которые я смог найти (didFailLoadWithError, didFinishLoading и т. Д.), И он никогда не достигает ни одного из них. Возможно, это проблема с моим сайтом? – Andrew

2

Существует способ сделать это на законных основаниях (по крайней мере, по законам App Store). При использовании NSURLConnection есть 2 способа, которые могут быть использованы, чтобы позволить самозаверенные SSL сертификаты, которые будут использоваться:

How to use NSURLConnection to connect with SSL for an untrusted cert?

Если вы реализуете UIWebViewDelegate используют

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 

Возвращение NO этому так что WebView не загружается самостоятельно. Затем создайте NSURLConnection (которое можно использовать с неподписанными сертификатами по вышеуказанной ссылке).

Конечно, обычные рекомендации SSL применимы здесь:
-Не используйте сертификат без знака на производственных серверах!
-Всегда выдается предупреждение, позволяющее вашему пользователю решить, принимать ли сертификат или нет.

3

Используя следующие два метода мы можем позволить непроверенную SSL в UIWebView

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; 

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

Я ответил подробно, как достичь этого here

7

В прошивке 9, SSL соединение будет терпеть неудачу для всех недействительны или самого -подписанные сертификаты. Это поведение по умолчанию новой функции App Transport Security в iOS 9.0 или новее, а также в OS X 10.11 и более поздних версиях.

Вы можете переопределить это поведение в Info.plist, установив NSAllowsArbitraryLoads в YES в NSAppTransportSecurity словаре. Однако я рекомендую переопределить этот параметр только для целей тестирования.

enter image description here

Для получения дополнительной информации см App Транспорт Technote here.

+0

Если у вас есть самозаверяющий сертификат, я рекомендую открыть URL-адрес в мобильном Safari и сначала принять сертификацию. Это должно установить доверие. – johnnieb

0

Я знаю его немного поздно, но он может помочь другим, я нашел статью, чтобы обойти ssl в приложении iOS. Все, что вам нужно сделать, это настроить свой веб-просмотр и сделать запрос на отправку с приложения на ваш сервер, и если вы получите ошибка ssl, которая означает, что у вас нет действительного сертификата на вашем сервере. Чтобы обойти вас, вам нужно использовать делегаты webview, которые являются . 1.) Можно проверить подлинность с защитой. 2.) Необходимо начать загрузку с запросом 3.) Получил аутентификацию Challenge Вы можете скопировать эти функции из этого URL, для меня это работает очень хорошо. Надеюсь, это поможет

10

Свифт 3/4 версия для Nick Lockwood ответ.

Это только для целей тестирования/разработки:

extension NSURLRequest { 
    #if DEBUG 
    static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool { 
     return true 
    } 
    #endif 
} 
Смежные вопросы