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

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

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

Xcode

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

23 ответов


Если вы используете 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>

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

Enter image description here

вы должны установить NSAllowsArbitraryLoads ключ да под NSAppTransportSecurity словарь на свой .plist файл.

Plist configuration


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

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI


см. сообщение форума Безопасность Транспорта Приложений?.

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


Это было протестировано и работало на 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.


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

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

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

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

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

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

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

XML (в информации о файле.файл 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 С большим количеством вещей, объясненных в отношении безопасности

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


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

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

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

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

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

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

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


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

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

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

  2. найти Info.plist файл в навигаторе проекта и" правой кнопкой мыши " нажмите на него и выберите Открыть Как>Исходный Код опции меню. В правой области появится файл списка свойств.

  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.


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

  • нажмите на информацию.плист в навигаторе слева.
  • изменить данные в основной области:

    • в последней строке Добавить +
    • введите название группы:Настройки Безопасности Транспорта Приложения
    • щелкните правой кнопкой мыши на группе и выберите Add Row
    • Enter разрешить Произвольные Нагрузки
    • установите значение справа на да

Example


Apple Document 1

Apple Document 2

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

растворы 1 :

  1. на добавить словарь с ключом 'NSAppTransportSecurity'
  2. добавить еще один элемент внутри словаря с ключом 'Allow Arbitrary Loads'

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

Solution 1

решение 2 :

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

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

Solution 2

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


безопасность транспорта доступна в iOS 9.0 или более поздней версии. Это предупреждение может появиться при попытке вызвать WS внутри приложения:

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

добавление следующего к вашей информации.plist отключит ATS:

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

Пример

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

Enter image description here


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

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

перейти к вашей информации.файл plist

  1. щелкните правой кнопкой мыши на пустом месте и нажмите кнопку добавить строку
  2. напишите имя ключа как NSAppTransportSecurity, под ним
  3. выберите Домены исключений, добавьте новый элемент к этому
  4. запишите свое доменное имя, к которому необходимо получить доступ
  5. измените тип домена из строки в словарь, добавьте новый элемент
  6. NSTemporaryExceptionAllowsInsecurehttploads, это будет логическое значение с true значение. Look at the picture to follow it correctly

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

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

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

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

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

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


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

PList Screenshot to understand better

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


на 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>

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


Примечание: домен исключения в вашем plist должен быть в нижнем регистре.

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

--

ваша информация.файл 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>

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

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

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

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

информация.plist является одним из файлов ниже основного.раскадровка или viewController.быстрый.

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

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

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

 "</dict>
</plist>"

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


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

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

sandbox settings]

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


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

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

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

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

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

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


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

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

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

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