Не вдалося завантажити завантаження HTTP NSURLSession / NSURLConnection на iOS 9


137

Спробував запустити наявну програму на iOS9, але під час використання стався збій AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

Я отримую таку помилку:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Також отримують такі журнали:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

Оновлення: я додав кілька оновлень до свого рішення: NSURLSession / NSURLConnection завантаження HTTP не вдалося на iOS 9


Ви впевнені, що помилка відбувається на першому рядку?
BSMP

1
У мене було те саме питання. Це, здавалося, висвітлює проблему: stackoverflow.com/questions/30720813/…
phillies2628

Відповіді:


240

Знайдене рішення:

В iOS9 ATS застосовує кращі практики під час мережевих дзвінків, включаючи використання HTTPS.

З документації Apple:

ОВС запобігає випадковому розкриттю, забезпечує безпечну поведінку за замовчуванням і легко прийняти. Вам слід якомога швидше прийняти АТС, незалежно від того, створюєте ви новий додаток чи оновлюєте існуючий. Якщо ви розробляєте нову програму, слід використовувати виключно HTTPS. Якщо у вас є вже наявна програма, вам слід скористатися HTTPS якомога більше зараз, а також якнайшвидше створити план для міграції решти свого додатка.

В бета-версії 1 в даний час немає можливості визначити це в info.plist. Рішення - додати його вручну:

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

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

Update1: Це тимчасове рішення, поки ви не будете готові прийняти підтримку iOS9 ATS.

Update2: Більш детальну інформацію можна отримати за посиланням: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: Якщо ви намагаєтеся підключитися до хоста (YOURHOST.COM), у якого є лише TLS 1.0

Додайте їх до Info.plist свого додатка

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Будьте в курсі, що ви щойно позбулися захисту безпеки транспорту додатків, тому одна головна функція iOS 9 просто пішла з вашого додатка. Це злом, і я не був би здивований, якби цей хак відмовив вашу ап. Додавання певних веб-сайтів до цих словників швидше буде дозволено.
gnasher729

2
@StevenPeterson Ви зможете вилучити лише весь додаток у кожному конкретному випадку від Apple. Я припускаю, що якщо Apple благословить ваш додаток такою здатністю, вони доручать вам включити цей ключ. Чекайте, що Apple робить це рідко.
mattyohe

8
Будь ласка, будь ласка, будь ласка, будь ласка, - не просто додайте виняток у свій список і рухайтеся далі "просто тому, що це працює". Розгляньте безпеку даних свого користувача та застосуйте SSL та інші найкращі практики безпеки.
Дід Мороз

8
@ gnasher729, я розумію, що краще підтримувати TLS 1.2, а не просто вимикати ATS. Однак що робити, якщо ви покладаєтесь на сторонній API / веб-сервіс. Я не можу змусити їх оновити, і що я можу зробити ??
Вудсток

7
У цій відповіді є непомітна помилка: NSTemporaryExceptionMinimumTLSVersionповинна бути, наприклад, TLSv1.0 замість 1,0 ; див. Ключі домену словника доменів
mbi

54

Як боротися з SSL в iOS9 , Одне рішення - зробити так:

Як кажуть Apple : введіть тут опис зображення введіть тут опис зображення

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

iOS 9 та OSX 10.11 вимагають TLSv1.2 SSL для всіх хостів, з яких ви плануєте запитувати дані, якщо ви не вказали домени виключень у файлі Info.plist додатка.

Синтаксис для конфігурації Info.plist виглядає приблизно так:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Якщо ваша програма (наприклад, веб-браузер сторонніх розробників) потребує підключення до довільних хостів, ви можете налаштувати її так:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Якщо вам потрібно це зробити, можливо, найкраще оновити свої сервери для використання TLSv1.2 та SSL, якщо вони цього ще не роблять. Це слід вважати тимчасовим рішенням.

На сьогоднішній день в документації на попередній випуск жодним чином не згадується жоден із цих параметрів конфігурації. Як тільки це станеться, я оновлю відповідь, щоб посилатися на відповідну документацію.

Для отримання додаткової інформації перейдіть до iOS9AdaptationTips


4
SSL і TLS - це різні шари шифрування, які використовуються протоколами HTTPS. Таким чином, слід взагалі відключити SSL та використовувати TLS v1.2 або новішу версію. Для отримання додаткової інформації я рекомендую почати з наступного ресурсу: SSL / TLS Security 2015 - спрощений короткий посібник
Конрад Тейлор

2
Я маю додати лише удачу в нижньому прикладі, коли ви встановите NSAllowsArbitraryLoads на істинне. Мій сервер ексклюзивно використовує TLS v1.2, і мені все одно потрібно це зробити, щоб він працював. Дуже засмучує.
Скутер

1
Так чи є якесь вирішення, яке я міг би використати, щоб точно знати, що мій новий додаток буде затверджено в App Store, наприклад, проксі-сервіс?
Джош

41

Технотематика Apple щодо безпеки прикладного транспорту дуже зручна ; це допомогло нам знайти більш безпечне рішення нашої проблеми.

Сподіваємось, це допоможе комусь іншому. У нас виникли проблеми з підключенням до URL-адрес Amazon S3, які виявилися абсолютно дійсними, URL-адресами TLSv12 HTTPS. Виявляється, нам довелося відключити, NSExceptionRequiresForwardSecrecyщоб увімкнути ще кілька шифрів, які використовує S3.

У нашому Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

Це була моя точна проблема, і вона вирішила її миттєво! Спасибі! :)
Алекс Зак

Це вирішує проблему, яку я теж мав; Однак у різних випадках можуть знадобитися різні налаштування. Хороша новина полягає в тому, що він також містить інформацію про те, як користуватися nsurl, щоб допомогти вам знайти правильні налаштування в цілому.
екотакс

Мені потрібно було зробити те ж саме для cloudfront.net, якщо я використовував CDN перед Amazon S3.
Raymond26

7

Якщо у вас виникають проблеми з Amazon S3 як у мене, спробуйте вставити це у свій список info.plist як безпосереднє дочірнє тег верхнього рівня

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

Додаткову інформацію можна знайти за адресою:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
Бог благословить тебе брате
Верватовскіс

5

Я знайшов рішення звідси. І це працює для мене.

Перевірте це, це може вам допомогти.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>

4

Просто додайте наступні поля у файл .plist

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

Синтаксис виглядає приблизно так:

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

Це дозволить отримати всі http-запити. Працює, але не рекомендується.
KVISH

2

Оновлення:

Станом на Xcode 7.1, вам не потрібно вручну вводити NSAppTransportSecurityСловник у info.plist.

Тепер він автоматично заповниться для вас, зрозумійте, що це словник, а потім також автоматично заповнить Allows Arbitraryвантажі. Скріншот info.plist


Це дозволить отримати всі http-запити. Працює, але не рекомендується.
KVISH

2

Вирішіть помилку завантаження NSURLConnection Http. Додайте наступний Dict у info.plist:

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

1

Я вирішив це, додавши ключ в info.plist. Наступні кроки:

Я відкрив файл info.plist свого проекту

Додано ключ під назвою NSAppTransportSecurity як словник.

Додано підрозділ під назвою NSAllowsArbitraryLoads як булевий і встановить його значення YES як наступне зображення. введіть тут опис зображення

Очистіть проект і тепер усе працює нормально, як раніше.

Посилання для посилання: https://stackoverflow.com/a/32609970


1

Це те, що працювало для мене, коли я мав цю помилку:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

Ви можете спробувати додати цю функцію у файл RCTHTTPRequestHandler.m

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

Окрім вищезазначених відповідей, перевірте свою URL-адресу


У моєму випадку я намагався завантажити .html файл.
Вайшнаві

0

Ви повинні додати App Transport Security Settingsдо info.plistі додати Allow Arbitrary LoadsдоApp Transport Security Settings

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

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