Так как я обновил свой существующий проект с помощью iOS 9, я все равно получаю ошибку:
Произошла ошибка SSL и не удалось создать безопасное соединение с сервером.
Так как я обновил свой существующий проект с помощью iOS 9, я все равно получаю ошибку:
Произошла ошибка SSL и не удалось создать безопасное соединение с сервером.
Для iOS9 Apple приняла радикальное решение с iOS 9, отключив весь незащищенный HTTP-трафик от приложений iOS в составе Безопасность транспорта приложений (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>
iOS 9 заставляет соединения, которые используют HTTPS, быть TLS 1.2, чтобы избежать недавних уязвимостей. В iOS 8 поддерживались даже незашифрованные HTTP-соединения, поэтому более старые версии TLS также не вызывали проблем. В качестве обходного пути вы можете добавить этот фрагмент кода к вашему Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* ссылается на Безопасность транспорта приложений (ATS)
Если вы просто нацеливаете определенные домены, вы можете попробовать и добавить это в свое приложение 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.0.2 прерывает запросы к действительным конечным точкам HTTPS. Мое текущее подозрение в том, что он требует сертификатов SHA-256 или сбой этой ошибки.
Чтобы воспроизвести, проверьте свой UIWebView на сафари и попробуйте перейти к произвольной конечной точке 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
тоже будет работать, хотя я прочитал, что полностью отключить его может подвергнуть риску ваш обзор приложения.
[EDIT] Я обнаружил, что просто перечисление доменов, к которым я подключаюсь в NSExceptionDomains
dict, исправляет эту проблему, даже если оставить NSExceptionAllowsInsecureHTTPLoads
равным true.:\
Проблема заключается в сертификате ssl на стороне сервера. Либо что-то мешает, либо сертификат не соответствует службе. Например, когда сайт имеет сертификат ssl для www.mydomain.com, а служба, которую вы используете, запускается на myservice.mydomain.com. Это другая машина.
Я получаю ту же ошибку, когда я указываю свой URL-адрес HTTPS как: https://www.mywebsite.com. Однако он отлично работает, когда я укажу его без трех W как: https://mywebsite.com.
Проект Xcode → goto info.plist и нажмите кнопку +, затем добавьте (Настройки безопасности для транспорта приложения). Разверните, разрешите произвольные загрузки. Установите YES. Благодаря
Моя проблема была NSURLConnection
и она устарела в iOS9, поэтому я изменил весь API на NSURLSession
и это NSURLSession
мою проблему.
В моем случае я столкнулся с этой проблемой в моем симуляторе, потому что дата моего компьютера была позади текущей даты. Так что проверьте этот случай тоже, когда вы сталкиваетесь с ошибкой SSL.