iOS9 получает сообщение об ошибке "Произошла ошибка SSL и невозможно установить безопасное соединение с сервером"

Так как я обновил свой существующий проект с помощью iOS 9, я все равно получаю ошибку:

Произошла ошибка SSL и не удалось создать безопасное соединение с сервером.

Ответы

Ответ 1

Для iOS9 Apple приняла радикальное решение с iOS 9, отключив весь незащищенный HTTP-трафик от приложений iOS в составе Безопасность транспорта приложений (ATS).

Чтобы просто отключить ATS, вы можете выполнить следующие действия, откройте Info.plist и добавьте следующие строки:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>

Ответ 2

Даже если разрешение произвольных нагрузок (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>

Ответ 3

iOS 9 заставляет соединения, которые используют HTTPS, быть TLS 1.2, чтобы избежать недавних уязвимостей. В iOS 8 поддерживались даже незашифрованные HTTP-соединения, поэтому более старые версии TLS также не вызывали проблем. В качестве обходного пути вы можете добавить этот фрагмент кода к вашему Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

* ссылается на Безопасность транспорта приложений (ATS)

введите описание изображения здесь

Ответ 4

Если вы просто нацеливаете определенные домены, вы можете попробовать и добавить это в свое приложение 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>

Ответ 5

Похоже, что 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.:\

Ответ 6

Проблема заключается в сертификате ssl на стороне сервера. Либо что-то мешает, либо сертификат не соответствует службе. Например, когда сайт имеет сертификат ssl для www.mydomain.com, а служба, которую вы используете, запускается на myservice.mydomain.com. Это другая машина.

Ответ 7

Я получаю ту же ошибку, когда я указываю свой URL-адрес HTTPS как: https://www.mywebsite.com. Однако он отлично работает, когда я укажу его без трех W как: https://mywebsite.com.

Ответ 8

Проект Xcode → goto info.plist и нажмите кнопку +, затем добавьте (Настройки безопасности для транспорта приложения). Разверните, разрешите произвольные загрузки. Установите YES. Благодаря

Ответ 9

Моя проблема была NSURLConnection и она устарела в iOS9, поэтому я изменил весь API на NSURLSession и это NSURLSession мою проблему.

NSURLConnection устарела в iOS9

Ответ 10

В моем случае я столкнулся с этой проблемой в моем симуляторе, потому что дата моего компьютера была позади текущей даты. Так что проверьте этот случай тоже, когда вы сталкиваетесь с ошибкой SSL.