it-swarm.com.ru

Транспортная безопасность заблокировала открытый текст HTTP

Какие настройки мне нужно добавить в свой info.plist, чтобы включить режим HTTP согласно следующему сообщению об ошибке?

Безопасность транспорта заблокировала загрузку ресурса HTTP (http: //) в виде открытого текста, поскольку она небезопасна. Временные исключения можно настроить с помощью файла Info.plist вашего приложения.

Xcode

Предположим, что мой домен example.com.

1386
Jeef

Если вы используете Xcode 8.0 и Swift 3.0 или Swift 2.2 или даже Objective C:

Enter image description here

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
373
Anit Kumar

Использование:

Enter image description here

Вы должны установить NSAllowsArbitraryLoads ключ ДА в NSAppTransportSecurity словарь в вашем файле .plist.

Plist configuration

916
CristiCh

Вот настройки визуально:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI

813
William Cerniuk

Смотрите сообщение на форуме Application Transport Security?.

Также страница Настройка исключений безопасности транспорта приложений в iOS 9 и OSX 10.11.

Например, вы можете добавить определенный домен, например:

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

Ленивый вариант:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Замечания:

info.plist - это файл XML, поэтому вы можете разместить этот код более или менее в любом месте файла.

702
KMLong

Это было проверено и работало на iOS 9 GM seed - это конфигурация, позволяющая конкретному домену использовать HTTP вместо HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoads должно быть false, поскольку оно запрещает все небезопасное соединение, но список исключений позволяет подключаться к некоторым доменам без HTTPS.

316
Sound Blaster

Это быстрый обходной путь (но не рекомендуется), чтобы добавить это в plist:

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

Что означает (согласно документация Apple ):

NSAllowsArbitraryLoads
Логическое значение, используемое для отключения App Transport Security для любых доменов, не перечисленных в словаре NSExceptionDomains. Перечисленные домены используют настройки, указанные для этого домена.

Значение по умолчанию NO требует поведения App Transport Security по умолчанию для всех соединений.

Я действительно рекомендую ссылки:

которые помогают мне понять причины и все последствия.

XML (в файле Info.plist) ниже будет:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

запретить произвольные вызовы для всех страниц, но для PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE разрешит, чтобы соединения использовали протокол HTTP.

К приведенному выше XML вы можете добавить:

<key>NSIncludesSubdomains</key>
<true/>

если вы хотите разрешить незащищенные соединения для поддоменов указанного адреса.

Наилучший подход состоит в том, чтобы заблокировать все произвольные загрузки (установить в false) и добавить исключения, чтобы разрешить только те адреса, которые нам известны.

для заинтересованных читателей

Обновление 2018 года:

Apple не рекомендует отключать это - больше информации можно найти в 207 сессия WWDC 2018 с большим количеством объяснений, касающихся безопасности

Оставив первоначальный ответ по историческим причинам и фазе разработки

141
Julian Król

Для тех из вас, кто хочет больше узнать о , почему это происходит в дополнение к тому, как исправить это, а затем прочитать ниже.

С появлением iOS 9 для повышения безопасности соединений между приложением и веб-службами безопасные соединения между приложением и его веб-службой должны соответствовать передовым методам . Поведение передового опыта обеспечивается App Transport Security для:

  • предотвратить случайное раскрытие и
  • обеспечить поведение по умолчанию, которое является безопасным.

Как описано в Техника безопасности транспорта транспорта , при обмене данными с веб-службой App Transport Security теперь имеет следующие требования и поведение:

  • Сервер должен поддерживать по крайней мере протокол 1.2 TLS.
  • Соединительные шифры ограничены теми, которые обеспечивают прямую секретность (см. Список шифров ниже.)
  • Сертификаты должны быть подписаны с использованием алгоритма хеширования подписи SHA256 или более лучшего, с ключом RSA 2048 бит или более или ключом Elliptic-Curve (ECC) 256 бит или более.
  • Недействительные сертификаты приводят к серьезному отказу и отсутствию соединения.

Другими словами, ваш запрос веб-службы должен: a.) Использовать HTTPS и b.) Шифроваться с использованием TLS v1.2 с прямой секретностью.

Однако, как упоминалось в других публикациях, вы можете переопределить это новое поведение из App Transport Security, указав небезопасный домен в Info.plist вашего приложения.


Для переопределения вам необходимо добавить свойства словаря NSAppTransportSecurity> NSExceptionDomains в ваш Info.plist. Затем вы добавите домен вашего веб-сервиса в словарь NSExceptionDomains.

Например, если я хочу обойти поведение App Transport Security для веб-службы на хосте www.yourwebservicehost.com , то я бы сделал следующее:

  1. Откройте свое приложение в Xcode.

  2. Найдите файл Info.plist в Project Navigator и щелкните правой кнопкой мыши по нему и выберите Открыть как > Исходный код в меню , Файл списка свойств появится на правой панели.

  3. Поместите следующий блок свойств в основной словарь свойств (под первым <dict>).


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Если вам нужно предоставить исключения для дополнительных доменов, вы должны добавить другое свойство словаря под NSExceptionDomains.

Чтобы узнать больше о ссылках, указанных выше, прочитайте это уже упоминавшийся technote .

114
whyceewhite

Я не люблю редактировать список напрямую. Вы можете легко добавить его в список с помощью графического интерфейса:

  • Нажмите на Info.plist в навигаторе слева.
  • Теперь измените данные в основной области:

    • В последней строке добавьте +
    • Введите имя группы: Настройки безопасности транспорта приложения
    • Щелкните правой кнопкой мыши группу и выберите Add Row
    • Введите Разрешить произвольные загрузки
    • Установите значение справа ДА

Example

65
Vincent

Apple Document 1

Apple Document 2

Для этого есть два решения:

Решения 1:

  1. В файле Info.plist добавить словарь с ключом NSAppTransportSecurity
  2. Добавьте еще один элемент в словарь с ключом 'Allow Arbitrary Loads'

Структура Plist должна выглядеть так, как показано на рисунке ниже.

Solution 1

Решение 2:

  1. В файле Info.plist добавить словарь с ключом NSAppTransportSecurity
  2. Добавьте еще один элемент в словарь с ключом 'NSExceptionDomains'
  3. Добавить элемент с ключом 'MyDomainName.com' типа NSDictionary
  4. Добавьте элемент с ключом 'NSIncludesSubdomains' типа Boolean и значением, установленным как YES
  5. Добавьте элемент с ключом 'NSTemporaryExceptionAllowsInsecureHTTPLoads' типа Boolean и значением, установленным как YES

Структура Plist должна выглядеть так, как показано на рисунке ниже.

Solution 2

Решение 2 является предпочтительным, поскольку оно разрешает только выбранный домен, тогда как решение 1 разрешает все незащищенные HTTP-соединения.

25
Jayprakash Dubey

Транспортная безопасность доступна на iOS 9.0 или более поздней версии. Вы можете получить это предупреждение при попытке вызвать WS внутри вашего приложения:

Application Transport Security заблокировал загрузку ресурса HTTP (http: //) в виде открытого текста, поскольку он небезопасен. Временные исключения можно настроить с помощью файла Info.plist вашего приложения.

Добавление следующего в ваш Info.plist отключит ATS:

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key><true/>
</dict>
20
Malek Belkahla

Пример разработки

Вот скриншот plist, который сохраняет ATS нетронутым (= secure), но позволяет подключаться к localhost через HTTP вместо HTTPS . Работает в Xcode 7.1.1.

Enter image description here

14
Sebastian

Перейти к вашему Info.plist

  1. Щелкните правой кнопкой мыши на пустом месте и нажмите Добавить строку
  2. Напишите имя ключа как NSAppTransportSecurity, под ним
  3. Выберите Exception Domains, добавьте новый элемент к этому
  4. Запишите ваше доменное имя, которое необходимо получить доступ
  5. Измените тип домена со строки на словарь, добавьте новый элемент
  6. NSTeditionalExceptionAllowsInsecureHTTPLoads, это будет логическое значение с истинным значением. Look at the picture to follow it correctly
12
Shailendra Suriyal

Выяснение того, какие настройки можно использовать, может быть выполнено автоматически, как упомянуто в этот technote :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
11
ecotax

По словам Apple, обычно отключение ATS приведет к отклонению приложения, если только у вас нет для этого веской причины. Даже тогда вы должны добавить исключения для доменов, к которым вы можете получить безопасный доступ.

У Apple есть отличный инструмент, который говорит вам, какие именно настройки использовать: в Терминале введите

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

и nscurl проверит, не выполнен ли этот запрос, а затем попробует различные настройки и скажет вам, какой из них пропущен и что делать. Например, для некоторого стороннего URL, который я посещаю, эта команда сказала мне, что этот словарь проходит:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Чтобы различать ваши собственные сайты и сторонние сайты, которые находятся вне вашего контроля, используйте, например, ключ NSThirdPartyExceptionRequiresForwardSecrecy.

10
gnasher729

2015-09-25 (после обновлений Xcode 2015-09-18):

Я использовал не ленивый метод, но он не работал. Следующие мои попытки.

Первый,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

И второе,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Наконец, я использовал ленивый метод:

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

Это может быть немного небезопасно, но я не мог найти другие решения.

9
Heedoo

ПРИМЕЧАНИЕ. Домен исключения в вашем списке должен быть в нижнем регистре.

Пример: вы назвали свой компьютер "MyAwesomeMacbook" в "Настройки-> Общий доступ"; ваш сервер (в целях тестирования) работает на MyAwesomeMacbook.local: 3000, и ваше приложение должно отправить запрос на http: //MyAwesomeMacbook.local: 3000/files ..., ваш список нужно будет указать "myawesomemacbook.local" в качестве домена исключения.

-

Ваш info.plist будет содержать ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>
9
ObjectiveTC

В Swift 4 и xocde 10 измените NSAllowsArbitraryLoads на Allow Произвольные загрузки. так это будет выглядеть так:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>
8
Faris

Использование:

PList Screenshot to understand better

Добавьте новый элемент NSAppTransportSecurity в файл plist с типом словаря , затем добавьте подпункт NSAllowsArbitraryLoads в словарь типа Boolean и установите значение bool ДА. Это работает для меня.

7
Tejinder

Возможно, стоит упомянуть, как туда добраться ...

Info.plist - это один из файлов под Main.storyboard или viewController.Swift.

Когда вы нажимаете на него в первый раз, он обычно находится в табличном формате, поэтому щелкните правой кнопкой мыши файл и выберите "открыть как" исходный код, а затем добавьте приведенный ниже код в конец, т.е.

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

Скопируйте и вставьте код чуть выше

 "</dict>
</plist>"

который в конце.

6
Naishta

Обновление для Xcode 7.1, сталкивающееся с проблемой 27.10.15:

Новое значение в Info.plist - "Настройки безопасности транспорта приложения". Оттуда этот словарь должен содержать:

  • Разрешить произвольные нагрузки = ДА
  • Домены исключений (укажите здесь свой http-домен)
5
MkaysWork

Для тех, кто пришел сюда, пытаясь найти причину, по которой их WKWebView всегда белый и ничего не загружает (в точности, как описано здесь как мне заставить WKWebView работать в Swift и ​​для приложения MacOS знак равно

Если все вышеперечисленное в области ракетостроения не работает, проверьте очевидное: настройки песочницы

sandbox settings]

Будучи новичком в Swift и ​​какао, но довольно опытным в программировании, я потратил около 20 часов, чтобы найти это решение. Ни один из десятков руководств по хипстерам для iOS, ни Apple заметок - ничто не упоминает этот маленький флажок.

3
Alekseev Vladimir

Использование NSExceptionDomains может не применять эффект одновременно, поскольку целевой сайт может загружать ресурсы (например, js файлы) из внешних доменов через http. Это может быть решено добавлением этих внешних доменов также в NSExceptionDomains.

Чтобы проверить, какие ресурсы не могут быть загружены, попробуйте использовать удаленную отладку. Вот учебник: http://geeklearning.io/Apache-cordova-and-remote-debugging-on-ios/

1
Nurlan

По умолчанию iOS поддерживает только HTTPS API. Поскольку HTTP не является безопасным, вам придется отключить безопасность транспорта приложения. Есть два способа отключить ATS:

1. Добавляем исходный код в info.plist проекта и добавляем следующий код в корневой тег.

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

2. Использование информации о проекте.

Нажмите на проект в левой панели, выберите проект в качестве цели и выберите вкладку информации. Вы должны добавить словарь в следующей структуре.

enter image description here

0
varunrathi28

Для Cordova, если вы хотите добавить его в свой ios.json, сделайте следующее:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

И это должно быть внутри:

"*-Info.plist": {
   "parents": {
   }
}
0
zeusstl