iOS9 получает ошибку "произошла ошибка ssl, и невозможно установить безопасное соединение с сервером"
Поскольку я обновил свой существующий проект до iOS 9, я получаю сообщение об ошибке:
Произошла ошибка SSL, и невозможно установить безопасное соединение с сервером.
14 ответов
Что касается iOS9, Apple сделала радикальное решение с iOS 9, отключив весь незащищенный HTTP-трафик из приложений iOS, как часть App Transport Security (ATS).
Чтобы просто отключить ATS, выполните следующие действия, открыв Info.plist и добавив следующие строки:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Даже если разрешить произвольные нагрузки (NSAllowsArbitraryLoads = true
) - хороший обходной путь, вы не должны полностью отключать ATS, а должны включать HTTP-соединение, которое хотите разрешить:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
Если вы просто нацеливаетесь на определенные домены, вы можете попробовать добавить это в Info.plist вашего приложения:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
iOS 9 заставляет соединения, которые используют HTTPS, быть TLS 1.2, чтобы избежать недавних уязвимостей. В iOS 8 поддерживались даже незашифрованные HTTP-соединения, поэтому старые версии TLS также не создавали проблем. В качестве обходного пути вы можете добавить этот фрагмент кода в свой Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* ссылка на App Transport Security (ATS)
Похоже, что iOS 9.0.2 прерывает запросы к действующим конечным точкам HTTPS. В настоящее время я подозреваю, что для этого требуются сертификаты SHA-256 или с этой ошибкой происходит сбой.
Для воспроизведения проверьте ваш UIWebView с помощью safari и попробуйте перейти к произвольной конечной точке HTTPS:
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
Теперь попробуйте зайти в Google (потому что, конечно, у них есть сертификат SHA-256):
location.href = "https://google.com"
// no problemo
Добавление исключения к транспортной безопасности (как описано в ответе @stéphane-bruckert выше) помогает исправить это. Я также предполагаю, что полностью отключить NSAppTransportSecurity
будет работать, хотя я читал, что полное отключение может поставить под угрозу ваш обзор приложения.
[РЕДАКТИРОВАТЬ] Я обнаружил, что просто перечисление доменов, к которым я подключаюсь в NSExceptionDomains
dict исправляет эту проблему даже при выходе NSExceptionAllowsInsecureHTTPLoads
установите в true.:\
Проблема в ssl сертификате на стороне сервера. Либо что-то мешает, либо сертификат не соответствует услуге. Например, когда на сайте есть сертификат ssl для www.mydomain.com, а используемая вами служба работает на myservice.mydomain.com. Это другая машина.
В моем случае у меня были открыты приложения для прослушивания сети, такие как Charles Proxy или Proxyman.
Я получаю ту же ошибку при указании URL-адреса HTTPS, как: https://www.mywebsite.com/. Тем не менее, он работает нормально, когда я указываю без трех W как: https://mywebsite.com/.
Я получал ошибку ниже при воспроизведении
finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>
Я убедился, что добавил запись в домены исключений в файл plist, а для NSAllowsArbitraryLoads установлено значение true, но я все еще видел ошибку.
Потом я понял, что проигрываю URL с https, а не с http.
Я установил URL-адрес видео на http, и проблема решена.
Проект Xcode -> goto info.plist и нажмите кнопку +, затем "Добавить" ("Настройки безопасности транспорта приложения") "Развернуть", "Разрешить произвольную загрузку" Установите "Да". Спасибо
В моем случае я столкнулся с этой проблемой в моем симуляторе, потому что дата моего компьютера была позади текущей даты. Так что проверьте этот случай тоже, когда вы сталкиваетесь с ошибкой SSL.
С помощью этого сайта я ввел адрес сервера, к которому делал запрос, и добавил сгенерированный SHA-ключ в info.plist.
https://www.ssllabs.com/ssltest/index.html
<key>NSAppTransportSecurity</key>
<dict>
<key>NSPinnedDomains</key>
<dict>
<key>Your domain here (www.api.com)</key>
<dict>
<key>NSPinnedLeafIdentities</key>
<array>
<dict>
<key>SPKI-SHA256-BASE64</key>
<string>******pfbtB5iNouq********rC8Nrb+AmLFKxV7qgM=</string>
</dict>
</array>
</dict>
</dict>
</dict>
Я получал эту ошибку для некоторых сетевых вызовов, а не для других. Я был подключен к общедоступному Wi-Fi. Этот бесплатный Wi-Fi, похоже, подделывал определенные URL-адреса и, следовательно, ошибку.
Когда я подключился к LTE, эта ошибка исчезла!
Моя проблема была NSURLConnection
и это устарело в iOS9, поэтому я изменил все API на NSURLSession
и это решило мою проблему.