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

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

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

Xcode

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

1305
задан Jeef 06 июля '15 в 23:10
источник поделиться
26 ответов

Если вы используете 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>
265
ответ дан Anit Kumar 28 окт. '16 в 10:06
источник поделиться

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

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

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

Конфигурация Plist

894
ответ дан CristiCh 04 авг. '15 в 13:42
источник поделиться

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

визуальные настройки для NSAllowsArbitraryLoads в info.plist через графический интерфейс Xcode

795
ответ дан William Cerniuk 14 нояб. '15 в 22:08
источник поделиться

Посмотреть сообщение на форуме 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 файл, поэтому вы можете размещать этот код более или менее внутри файла.

689
ответ дан KMLong 06 июля '15 в 23:19
источник поделиться

Это было протестировано и работало над семенами iOS 9 GM - это конфигурация, позволяющая конкретному домену использовать 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.

301
ответ дан Sound Blaster 14 сент. '15 в 11:36
источник поделиться

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

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

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

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

Значение по умолчанию для NO должно соответствовать стандарту по умолчанию для безопасности приложений для всех подключений.

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

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

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 с дополнительными разъяснениями в отношении безопасности

Оставив исходный ответ по историческим причинам и фазе развития

125
ответ дан Julian Król 01 сент. '15 в 15:10
источник поделиться

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

С введением iOS 9, чтобы улучшить безопасность соединений между приложением и веб-службами, безопасные соединения между приложением и его веб-службой должны соответствовать лучшим практикам. Поведение наилучшей практики выполняется с помощью Безопасность приложений > :

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

Как объясняется в App Transport Security Technote, при общении с вашим веб-сервисом App Transport Security теперь имеет следующие требования и поведение:

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

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

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


Чтобы переопределить, вам нужно добавить свойства словаря NSAppTransportSecurity > NSExceptionDomains к вашему Info.plist. Затем вы добавите домен веб-сервиса в словарь NSExceptionDomains.

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

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

  • Найдите файл Info.plist в Навигаторе проектов и щелкните правой кнопкой мыши на нем и выберите опцию Open As > Source Code. Файл свойств будет отображаться в правой панели.

  • Поместите следующий блок свойств внутри словаря основных свойств (под первым <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.

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

113
ответ дан whyceewhite 21 сент. '15 в 20:56
источник поделиться

Мне не нравится редактировать plist напрямую. Вы можете легко добавить его в plist с помощью GUI:

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

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

Пример

64
ответ дан Vincent 06 нояб. '15 в 11:06
источник поделиться

Apple Document 1

Apple Document 2

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

Решения 1:

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

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

Решение 1

Решение 2:

  • В Info.plist файл добавить словарь с ключом <NSAppTransportSecurity '
  • Добавить другой элемент внутри словаря с ключом <NSExceptionDomains
  • Добавить элемент с ключом 'MyDomainName.com' типа NSDictionary
  • Добавить элемент с ключом 'NSIncludesSubdomains' типа Boolean и значение, установленное как YES
  • Добавить элемент с ключом 'NSTemporaryExceptionAllowsInsecureHTTPLoads' типа Boolean и установить значение YES
Структура

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

Решение 2

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

24
ответ дан Jayprakash Dubey 10 марта '16 в 14:29
источник поделиться

Безопасность транспорта доступна на 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 18 сент. '15 в 20:36
источник поделиться

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

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

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

14
ответ дан Sebastian 30 нояб. '15 в 11:49
источник поделиться

Это тоже работает для меня; просто скопируйте и вставьте следующее в свой файл info.plist:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key>
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>
13
ответ дан Thiago Arreguy 03 дек. '17 в 6:22
поделиться

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

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
12
ответ дан ecotax 07 окт. '15 в 11:29
источник поделиться

Перейдите в свой Info.plist

  • Щелкните правой кнопкой мыши на пустое пространство и нажмите "Добавить строку"
  • Введите имя ключа как NSAppTransportSecurity, под ним
  • Выберите "Исключительные домены", добавьте новый элемент в этот
  • Запишите свое доменное имя, которое необходимо получить.
  • Измените тип домена из строки в словарь, добавьте новый элемент
  • NSTemporaryExceptionAllowsInsecureHTTPLoads, который будет логическим с истинным значением. Посмотрите на картинку, чтобы следовать ей правильно
10
ответ дан Shailendra Suriyal 09 янв. '17 в 9:28
источник поделиться

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

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

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

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

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

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

9
ответ дан gnasher729 18 апр. '16 в 2:54
источник поделиться

ПРИМЕЧАНИЕ. Область исключений в вашем plist должна быть в LOWER-CASE.

Пример: вы назвали свой аппарат "MyAwesomeMacbook" в разделе "Настройки" > "Обмен"; ваш сервер (для тестовых целей) работает на MyAwesomeMacbook.local: 3000, и ваше приложение должно отправить запрос http://MyAwesomeMacbook.local:3000/files..., ваш plist вам нужно будет указать "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>
8
ответ дан ObjectiveTC 12 сент. '16 в 21:17
источник поделиться

В 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>

Это может быть немного неуверенно, но я не нашел других решений.

8
ответ дан Heedoo 25 сент. '15 в 5:41
источник поделиться

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

Скриншот PList для лучшего понимания

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

8
ответ дан Tejinder 21 сент. '15 в 12:11
источник поделиться

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

Info.plist является одним из файлов ниже Main.storyboard или viewController.swift.

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

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

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

 "</dict>
</plist>"

который находится в конце.

6
ответ дан Naishta 25 окт. '15 в 20:18
источник поделиться

Обновление для Xcode 7.1, перед проблемой 27.10.15:

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

  • Разрешить произвольные нагрузки = YES
  • Исключительные домены (укажите здесь свой домен http)
6
ответ дан MkaysWork 27 окт. '15 в 22:21
источник поделиться

В Xcode 7 нам нужно сделать так:

В файле Info.plist добавьте:

  • NSAppTransportSecurity Как словарь и ребенок как
  • NSAllowsArbitraryLoads В качестве логического значения YES
4
ответ дан Uma Madhavi 03 дек. '17 в 6:23
поделиться

Добавьте этот код в файл info.plist:

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key><true/>
</dict>
4
ответ дан Jayesh Miruliya 03 дек. '17 в 6:22
поделиться

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

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

sandbox settings]

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

2
ответ дан Alekseev Vladimir 09 окт. '17 в 13:44
источник поделиться

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

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

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

"*-Info.plist": {
   "parents": {
   }
}
1
ответ дан zeusstl 21 марта '16 в 15:41
источник поделиться

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

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

1
ответ дан Nurlan 14 авг. '17 в 9:12
источник поделиться

Как отмечали многие, это проблема с функцией iOS 9.0. Они добавили что-то вроде App Transport Security, и я тоже был раздражен, когда он нарушил мои приложения.

Вы можете перевязать его с помощью ключа NSAllowsArbitraryLoads к YES в словаре NSAppTransportSecurity в вашем файле .plist, но в конечном итоге вам нужно будет переписать код, который формирует ваши URL, чтобы сформировать префикс HTTPS://.

Apple переписала класс NSUrlConnection в iOS 9.0. Вы можете прочитать об этом в NSURLConnection.

Кроме того, вам, возможно, придется отказаться от iOS 9.0, пока у вас не будет времени для реализации правильного решения.

-4
ответ дан Mark DeWald 01 окт. '15 в 21:41
источник поделиться

Другие вопросы по меткам