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


109

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

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


3
В моем случае это была ошибка прокси. Ответ здесь. stackoverflow.com/a/34787953/3840428
Нагарджун

Ответы:


123

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

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

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

46
Я добавил приведенные выше строки в plist, но по-прежнему получаю следующую ошибку: Произошла ошибка SSL, и невозможно установить безопасное соединение с сервером. NSLocalizedRecoverySuggestion = Вы все равно хотите подключиться к серверу ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Я вызываю HTTPS-запрос. Есть ли другой вариант для HTTPS?
AiOsN

1
AiOsN = такая же проблема, вы нашли решение?
Franck

5
Кажется, это распространенное неправильное толкование, что NSAllowsArbitraryLoads - это переключатель для включения или отключения ATS. Как только вы выполняете запрос https: //, вы должны убедиться, что вы соответствуете ATS-требованиям: действующий сертификат, установленный на сервере (без подстановочных знаков, точно соответствующий доменному имени сервера), сервер поддерживает TLS 1.2 с пересылкой секретность.
Christian

@Christian Что является источником этих требований ATS? Я ничего не могу найти о том, что не поддерживает подстановочные сертификаты.
Барт,

@Bartosz Извините, я не могу указать вам на официальный документ, это просто то, что мы наблюдали при обновлении нашей серверной инфраструктуры.
Кристиан,

64

Несмотря на то, что разрешение произвольной load ( 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>

2
Намного лучше, чем игнорировать все проблемы с безопасностью. Сервис Amazon S3 использует слабое шифрование, и загрузка напрямую на их серверы вызвала проблемы, но это позволило нам открыть только URL-адрес s3.amazonaws.com, оставив остальные в строке. Потрясающие!
mix3d

3
Сервер, к которому я пытался подключиться, использовал TLSv1.0. Мне пришлось добавить NSExceptionMinimumTLSVersion для tls1.0, чтобы обойти ошибку SLL
Испас Клаудиу

Этот ответ сработал для меня. Я использовал WKWebView и пытался сделать SSL-запрос к серверу API.
Fan Jin

Привет @ Стефан, у меня странная ситуация. На моем телефоне установлена ​​iOS версии 12.1.2, но я получил сообщение об ошибке «Произошла ошибка SSL, и невозможно установить безопасное соединение с сервером». Я обновил свой файл plist. Приложение работает нормально, и я снова удалил изменения, внесенные в info.plist. Теперь все работает нормально. Итак, я не могу найти настоящую причину этой ошибки. Любое предложение?
Mansuu ....

@Mansuu .... вы пытались использовать TLSv1.0, как было предложено в комментариях выше?
Стефан Брукерт

15

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

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

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

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


1
Для Swift 4+ настройки безопасности транспорта приложений -> Разрешить произвольные нагрузки = ДА
mehdigriche

14

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

У меня это не сработало. Да, я ввел правильный домен для "example.com".
Алешак

1
Для меня это работа. когда я делал пример только с работами «Разрешить произвольные нагрузки», но потом остановился. Когда я использовал ключ «NSExceptionRequiresForwardSecrecy» -> false и «NSIncludesSubdomains» -> true, он работает отлично. Большое спасибо!
linhadiretalipe

1
Это сработало и для меня! Несмотря на то, что я использую https-соединение, я все равно столкнулся с проблемой. В настоящее время нет поддержки NSExceptionRequiresForwardSecrecy. Из того, что я читал, раньше это указывать не было необходимости, но похоже, что они сделали это обязательным и сейчас. PS: Я пробовал с iOS 10.2.1
Vaibhav Misra

6

Похоже, что 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тоже сработает, хотя я читал, что полное отключение может поставить под угрозу обзор вашего приложения.

[EDIT] Я обнаружил, что простое перечисление доменов, к которым я подключаюсь, в NSExceptionDomainsdict устраняет эту проблему, даже если оставить NSExceptionAllowsInsecureHTTPLoadsзначение true. : \


2

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


У меня проблема с некоторыми URL-адресами, но не с другими на том же IP-адресе (домен и сервер)
user6631314


0

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


@AbdulYasin проверять свой список и проверять изменения погоды обновляются или нет?
Shanmugasundharam

1
В этом «непринужденном» ответе полностью отсутствуют объяснения и риски безопасности, связанные с этим обходным путем.
Мануэль


0

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


0

Я получал ошибку ниже при воспроизведении

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, и проблема решена.


0

Я получал эту ошибку для некоторых сетевых вызовов, а не для других. Я был подключен к общедоступному Wi-Fi. Этот бесплатный Wi-Fi, похоже, подделал определенные URL-адреса и, следовательно, ошибку.

Когда я подключился к LTE, эта ошибка исчезла!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.