Помилка отримання iOS9 "сталася помилка SSL і захищене з'єднання з сервером неможливо зробити"


109

Оскільки я модернізував свій існуючий проект на iOS 9, я продовжую отримувати помилку:

Сталася помилка SSL і захищене з'єднання з сервером неможливо зробити.


3
Це була помилка проксі в моєму випадку, тут я знайшов відповідь. stackoverflow.com/a/34787953/3840428
Нагарджун

Відповіді:


123

Що стосується iOS9, Apple прийняла радикальне рішення з iOS 9, відключивши весь незахищений трафік HTTP з iOS-додатків, як частина програми безпеки транспортного забезпечення додатків (ATS) .

Щоб просто відключити ATS, ви можете виконати ці кроки, відкривши Info.plist та додавши наступні рядки:

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

46
Я додав вище рядки в пліст, але все ще отримую таку помилку: сталася помилка SSL і захищене з'єднання з сервером неможливо зробити. NSLocalizedRecoverySuggestion = Чи хочете ви все-таки підключитися до сервера? _ _CCFNetworkCFStreamSSLErrorOriginalValue = -9819 Я дзвоню HTTPS-запит. Чи є інший варіант для HTTPS?
AiOsN

1
AiOsN = та ж проблема тут, ти знайшов рішення?
Франк

5
Здається, поширене неправильне трактування, що NSAllowsArbitraryLoads - це перемикач для включення або відключення ОВС. Як тільки ви робите запит https: //, ви повинні переконатися, що ви відповідаєте вимогам ATS: дійсний сертифікат, встановлений на сервері (без підстановки, точно відповідає доменному імені сервера), сервер підтримує TLS 1.2 з переадресацією секретність.
Крістіан

@ Chhristian Що є джерелом цих вимог щодо ОВС? Я не можу знайти нічого про непідтримку сертифікатів підстановки.
Барт

@Bartosz Вибачте, я не можу вказати вам на офіційний документ, це лише щось, що ми спостерігали під час оновлення нашої серверної інфраструктури.
Крістіан

64

Незважаючи на те, що дозволити довільні навантаження ( 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
Набагато краще, ніж ігнорувати всі проблеми безпеки. Служба S3 Amazon використовує слабке шифрування, і завантаження безпосередньо на їхні сервери спричиняло проблеми, але це дозволило нам відкрити лише URL-адресу s3.amazonaws.com, залишаючи решту в іншому. Дивовижно!
mix3d

3
Сервер, до якого я намагався досягти, використовував TLSv1.0. Мені довелося додати NSExceptionMinimumTLSVersion для tls1.0, щоб обійти помилку SLL
Ispas Claudiu

Ця відповідь спрацювала на мене. Я використовував WKWebView і намагався зробити запит SSL на сервер API.
Вболівальник Цзінь

Привіт @ Stéphane, у мене склалася дивна ситуація. У моєму телефоні версія iOS версії 12.1.2, але я отримав помилку "Сталася помилка SSL і захищене з'єднання з сервером неможливо зробити". Що я зробив - це оновлений файл плістів. Додаток працює добре, і я знову видалив зміни, внесені в info.plist. Зараз це працює нормально. Отже, я не в змозі знайти фактичну причину цієї помилки. Будь-яка пропозиція?
Mansuu ....

@Mansuu .... ви намагалися використовувати TLSv1.0, як було запропоновано у коментарях вище?
Stéphane Bruckert

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 certs або він не вдається з цією помилкою.

Щоб відтворити, перевірте свій 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] Я виявив, що просто перерахування доменів, до яких я підключаюсь у 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 встановлено на істину, і все ж я бачив помилку.

Тоді я зрозумів, що я граю URL з https, а не http.

Я встановив URL-адресу відео на http і вирішено проблему.


0

Я отримував цю помилку для деяких мережевих дзвінків, а не для інших. Мене підключили до загальнодоступного wifi. Цей безкоштовний wifi, схоже, підробляє певні URL-адреси, а отже, і помилка.

Коли я підключився до LTE, ця помилка зникла!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.