Транспортная безопасность заблокировала открытый текст HTTP
Какие настройки мне нужно установить в info.plist
включить режим HTTP согласно следующему сообщению об ошибке?
Безопасность транспорта заблокировала загрузку ресурса HTTP (http://) в виде открытого текста, поскольку она небезопасна. Временные исключения могут быть настроены через файл Info.plist вашего приложения.
Предположим, что мой домен example.com
,
29 ответов
Если вы используете Xcode 8.0 и Swift 3.0 или Swift 2.2 или даже Objective C:
<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>
Использование:
Вы должны установить ключ NSAllowsArbitraryLoads в значение YES в словаре NSAppTransportSecurity в вашем файле.plist.
Смотрите сообщение на форуме.,
Также на странице Настройка исключений безопасности транспорта приложений в 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
Логическое значение, используемое для отключения App Transport Security для любых доменов, не перечисленных в словаре NSExceptionDomains. Перечисленные домены используют настройки, указанные для этого домена.Значение по умолчанию NO требует поведения App Transport Security по умолчанию для всех соединений.
Я действительно рекомендую ссылки:
- Техническая записка Apple
- WWDC 2015 сессия 706 (Безопасность и ваши приложения) начинается около 1:50
- Сессия WWDC 2015 711 (Сетевое взаимодействие с NSURLSession)
- Сообщение в блоге Доставка приложения с помощью приложения 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 с большим количеством вещей, объясненных относительно безопасности
Оставив первоначальный ответ по историческим причинам и фазе разработки
Для тех из вас, кто хочет узнать больше о том, почему это происходит, помимо того, как это исправить, читайте ниже.
С появлением iOS 9 для повышения безопасности соединений между приложением и веб-службами безопасные соединения между приложением и его веб-службой должны соответствовать передовым методам. Поведение передового опыта обеспечивается App Transport Security для:
- предотвратить случайное раскрытие и
- обеспечить поведение по умолчанию, которое является безопасным.
Как объяснено в Technote 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, я бы сделал следующее:
Откройте свое приложение в Xcode.
Найти
Info.plist
файл в Project Navigator и щелкните правой кнопкой мыши на нем и выберите пункт меню " Открыть как > Исходный код". Файл списка свойств появится на правой панели.Поместите следующий блок свойств в основной словарь свойств (под первым
<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.
Я не люблю редактировать список напрямую. Вы можете легко добавить его в список с помощью графического интерфейса:
- Нажмите на Info.plist в навигаторе слева.
Теперь измените данные в основной области:
- В последней строке добавьте +
- Введите имя группы: App Transport Security Settings
- Щелкните правой кнопкой мыши группу и выберите
Add Row
- Введите Разрешить Произвольные Нагрузки
- Установите значение справа ДА
Для этого есть два решения:
Решения 1:
- В
Info.plist
файл добавить словарь с ключомNSAppTransportSecurity
' - Добавить еще один элемент в словарь с ключом
'Allow Arbitrary Loads'
Plist
структура должна выглядеть так, как показано на рисунке ниже.
Решение 2:
- В
Info.plist
файл добавить словарь с ключомNSAppTransportSecurity
' - Добавить еще один элемент в словарь с ключом
NSExceptionDomains
' - Добавить элемент с ключом
'MyDomainName.com'
типа NSDictionary - Добавить элемент с ключом
NSIncludesSubdomains
типаBoolean
и значение установлено какYES
- Добавить элемент с ключом
NSTemporaryExceptionAllowsInsecureHTTPLoads
типаBoolean
и значение установлено какYES
Plist
структура должна выглядеть так, как показано на рисунке ниже.
Решение 2 является предпочтительным, поскольку оно разрешает только выбранный домен, тогда как решение 1 разрешает все незащищенные HTTP-соединения.
⚠️ Установить Allow Arbitrary Loads
к NO
!!!
Вы всегда должны использовать HTTPS
для ваших сетевых вещей. Но если вы действительно не можете, просто добавьте исключение вinfo.plist
Например, если вы используете http://google.com
и получив эту ошибку, вы ДОЛЖНЫ изменить ее наhttps://google.com
(с s), поскольку он поддерживает отлично.
Но если у вас что-то не получается (и вы не можете убедить backend-разработчиков поддерживать SSL), добавьте ТОЛЬКО этот незащищенный домен вinfo.plist
(вместо того, чтобы сделать его доступным для ВСЕЙ НЕЗАЩИТНОЙ СЕТИ!)
Транспортная безопасность доступна на iOS 9.0 или более поздней версии. Вы можете получить это предупреждение при попытке вызвать WS внутри вашего приложения:
Application Transport Security заблокировал загрузку ресурса HTTP (http://) в виде открытого текста, поскольку он небезопасен. Временные исключения могут быть настроены через файл Info.plist вашего приложения.
Добавление следующего в ваш Info.plist отключит ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Пример разработки
Вот скриншот plist, который сохраняет ATS нетронутым (= безопасным), но позволяет устанавливать соединения с localhost через HTTP вместо HTTPS. Работает в Xcode 7.1.1.
По словам Apple, обычно отключение ATS приведет к отклонению приложения, если только у вас нет для этого веской причины. Даже тогда вы должны добавить исключения для доменов, к которым вы можете получить безопасный доступ.
У Apple есть отличный инструмент, который говорит вам, какие именно настройки использовать: в Терминале введите
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
и nscurl проверит, не выполнен ли этот запрос, а затем попробует различные настройки и скажет вам, какой из них пропущен и что делать. Например, для некоторого стороннего URL, который я посещаю, эта команда сказала мне, что этот словарь проходит:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
Чтобы различать ваши собственные сайты и сторонние сайты, которые находятся вне вашего контроля, используйте, например, ключ NSThirdPartyExceptionRequiresForwardSecrecy.
Перейти к вашему Info.plist
- Щелкните правой кнопкой мыши на пустом месте и нажмите Добавить строку
- Напишите имя ключа как NSAppTransportSecurity, под ним
- Выберите Exception Domains, добавьте новый элемент к этому
- Запишите ваше доменное имя, которое необходимо получить доступ
- Измените тип домена со строки на словарь, добавьте новый элемент
- NSTeditionalExceptionAllowsInsecureHTTPLoads, это будет логическое значение с истинным значением.
Выяснение того, какие настройки использовать, может быть выполнено автоматически, как упомянуто в этом техническом замечании:
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
ПРИМЕЧАНИЕ. Домен исключений в вашем списке должен быть в нижнем регистре.
Пример: вы назвали свой компьютер "MyAwesomeMacbook" в "Настройки-> Общий доступ"; ваш сервер (в тестовых целях) работает на MyAwesomeMacbook.local:3000, и вашему приложению необходимо отправить запрос на http://myawesomemacbook.local:3000/files..., в вашем списке указывается myawesomemacbook. локальный "как домен исключения.
-
Ваш 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>
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>
Это может быть немного небезопасно, но я не мог найти другие решения.
Использование:
Добавьте новый элемент, NSAppTransportSecurity, в plist -файл с типом Dictionary, затем добавьте подпункт NSAllowsArbitraryLoads в словарь типа Boolean и установите значение bool YES. Это работает для меня.
В swift 4 и xocde 10 измените NSAllowsArbitraryLoads на Allow Произвольные загрузки. так это будет выглядеть так:
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key><true/>
</dict>
Обновление для Xcode 7.1, сталкивающееся с проблемой 27.10.15:
Новое значение в Info.plist - "Параметры безопасности транспорта приложения". Оттуда этот словарь должен содержать:
- Разрешить произвольные нагрузки = ДА
- Домены исключений (укажите здесь свой http-домен)
Возможно, стоит упомянуть, как туда добраться...
Info.plist - это один из файлов под Main.storyboard или viewController.swift.
Когда вы щелкаете по нему первый раз, он обычно находится в табличном формате, поэтому щелкните правой кнопкой мыши файл и выберите "открыть как" исходный код, а затем добавьте приведенный ниже код в конец, то есть:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
Скопируйте и вставьте код чуть выше
"</dict>
</plist>"
который в конце.
Для тех, кто пришел сюда, пытаясь найти причину, по которой их WKWebView всегда белый и ничего не загружает (в точности как описано здесь, как мне заставить WKWebView работать в swift и для приложения MacOS):
Если все вышеперечисленное в области ракетостроения не работает, проверьте очевидное: настройки песочницы
Будучи новичком в Swift и Cocoa, но довольно опытным в программировании, я потратил около 20 часов, чтобы найти это решение. Ни один из десятков обучающих руководств по хипстерам для iOS, ни яблочных лейтмотивов - ничто не упоминает этот маленький флажок.
В
Swift 5
у нас есть два способа преодолеть эту проблему. нам нужно добавить в
Я даю исходный код и изображение для справки
Первый - Добавить ->
NSAllowsArbitraryLoads
в .
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
</dict>
</plist>
Еще один метод - добавить
NSAppTransportSecurity
->
NSExceptionDomains
в
info.plist
и добавьте домен URL-адреса и включите разрешения для загрузки там поддоменов (
NSIncludesSubdomains
) и Разрешить небезопасные HTTP-загрузки (
NSExceptionAllowsInsecureHTTPLoads
)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.7timer.info</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
</dict>
</plist>
** Ну наконец то!!! Решенная безопасность транспорта приложений **
1. Follow the follow the screen shot. Do it in Targets info Section.
По умолчанию iOS разрешает только HTTPS API. Поскольку HTTP не является безопасным, вам придется отключить безопасность транспорта приложений. Есть два способа отключить ATS:-
1. Добавьте исходный код в проект info.plist и добавьте следующий код в корневой тег.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2. Использование информации о проекте.
Щелкните проект в проекте на левой панели, выберите проект в качестве целевого и выберите вкладку информации. Вам необходимо добавить словарь в следующую структуру.
С помощью NSExceptionDomains
может не применять эффект одновременно, поскольку целевой сайт может загружать ресурсы (например, js
файлы) из внешних доменов более http
, Это может быть решено путем добавления этих внешних доменов в NSExceptionDomains
также.
Чтобы проверить, какие ресурсы не могут быть загружены, попробуйте использовать удаленную отладку. Вот учебник: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
Для Cordova, если вы хотите добавить его в свой ios.json, сделайте следующее:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
И это должно быть внутри:
"*-Info.plist": {
"parents": {
}
}
Как многие уже отмечали, эта проблема связана с iOS 9.0. Они добавили что-то под названием App Transport Security, и я тоже был раздражен, когда он сломал мои приложения.
Вы можете перевязать его с помощью ключа NSAllowsArbitraryLoads на YES в словаре NSAppTransportSecurity в вашем файле.plist, но в конечном итоге вам потребуется переписать код, который формирует ваши URL, чтобы сформировать префикс HTTPS://.
Apple переписала класс NSUrlConnection в iOS 9.0. Вы можете прочитать об этом в NSURLConnection.
Иначе вам, возможно, придется отказаться от iOS 9.0, пока у вас не будет времени, чтобы реализовать правильное решение.