it-roy-ru.com

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

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

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

93
Nanda

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

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

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
102
Tony TRAN

Несмотря на то, что разрешить произвольные загрузки (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>
53
Stéphane Bruckert

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)

 enter image description here

14
TechSeeko

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

Похоже, что 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 устраняет эту проблему, даже если для NSExceptionAllowsInsecureHTTPLoads установлено значение true. : \

6
steve

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

2
Hashim Akhtar

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

2
Helge Becker

Проект Xcode -> goto info.plist и нажмите кнопку +, затем «Добавить» («Настройки безопасности транспорта приложения») «Развернуть», «Разрешить произвольную загрузку» Установите «ДА». Спасибо

1
Shanmugasundharam selvadurai

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

NSURLConnection устарела в iOS9

0
Akila Wasala

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

0
Teena nath Paul