Безопасность транспорта заблокировала простой текст HTTP
Какую настройку необходимо установить в мой info.plist
, чтобы включить режим HTTP в соответствии со следующим сообщением об ошибке?
Безопасность транспорта заблокировала ресурс netartext HTTP (http://) поскольку он небезопасен. Временные исключения можно настроить через файл вашего приложения Info.plist.
Предположим, что мой домен example.com
.
Если вы используете Xcode 8. 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>
Использовать NSAppTransportSecurity:
Вы должны установить ключ NSAllowsArbitraryLoads на ДА в словаре NSAppTransportSecurity в файле info.plist.
Похожие вопросы
Посмотреть сообщение на форуме 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 файл, поэтому вы можете размещать этот код более или менее внутри файла.
Это было протестировано и работало над семенами 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.
Это быстрый обходной путь (но не рекомендуется), чтобы добавить это в 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 теперь имеет следующие требования и поведение:
- Сервер должен поддерживать, по крайней мере, протокол безопасности транспортного уровня (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
.
Чтобы узнать больше о ключах, упомянутых выше, прочитайте этот уже упомянутый технот.
Мне не нравится редактировать plist напрямую. Вы можете легко добавить его в plist с помощью GUI:
- Нажмите на Info.plist в Навигаторе слева.
-
Теперь измените данные в основной области:
- В последней строке добавьте +
- Введите имя группы: Параметры безопасности при работе с портами
- Щелкните правой кнопкой мыши на группе и выберите
Add Row
- Введите Разрешить произвольные загрузки
- Задайте значение справа на YES
Для этого есть два решения:
Решения 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-соединения.
Безопасность транспорта доступна на 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 intact (= secure), но позволяет подключаться к localhost с помощью HTTP вместо HTTPS. Он работает в Xcode 7.1.1.
Это тоже работает для меня; просто скопируйте и вставьте следующее в свой файл 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>
Перейдите в свой Info.plist
- Щелкните правой кнопкой мыши на пустое пространство и нажмите "Добавить строку"
- Введите имя ключа как NSAppTransportSecurity, под ним
- Выберите "Исключительные домены", добавьте новый элемент в этот
- Запишите свое доменное имя, которое необходимо получить.
- Измените тип домена из строки в словарь, добавьте новый элемент
- NSTemporaryExceptionAllowsInsecureHTTPLoads, который будет логическим с истинным значением.
Выяснив, какие настройки можно использовать автоматически, как указано в этой технологии:
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
По словам Apple, в целом отключение ATS приведет к отклонению приложения, если у вас нет веских оснований для этого. Даже тогда вы должны добавить исключения для доменов, к которым вы можете безопасно получить доступ.
У Apple есть отличный инструмент, который подскажет вам, какие настройки использовать: В терминале введите
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
и nscurl проверит, не провалился ли этот запрос, а затем попробуйте различные настройки и сообщите вам, какой именно пароль и что делать. Например, для некоторых сторонних URL-адресов, которые я посещаю, эта команда сообщила мне, что этот словарь проходит:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
Чтобы провести различие между вашими собственными сайтами и сторонними сайтами, которые находятся вне вашего контроля, используйте, например, ключ NSThirdPartyExceptionRequiresForwardSecrecy.
В swift 4 и xocde 10 измените NSAllowsArbitraryLoads на Allow Произвольные загрузки. так это будет выглядеть так:
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key><true/>
</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>
Это может быть немного неуверенно, но я не нашел других решений.
ПРИМЕЧАНИЕ. Область исключений в вашем 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>
Использование:
Добавьте новый элемент NSAppTransportSecurity в файл plist с типом Словарь, затем добавьте подтекст NSAllowsArbitraryLoads в словаре типа Boolean и установите значение bool YES. Это работает для меня.
Возможно, стоит упомянуть, как туда добраться...
Info.plist является одним из файлов ниже Main.storyboard или viewController.swift.
Когда вы нажимаете на него в первый раз, он обычно находится в формате таблицы, поэтому щелкните правой кнопкой мыши файл и "откройте как" исходный код, а затем добавьте код ниже в конец, т.е.:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
Скопируйте код чуть выше
"</dict>
</plist>"
который находится в конце.
Обновление для Xcode 7.1, перед проблемой 27.10.15:
Новое значение в Info.plist - это "Параметры безопасности приложения". Оттуда этот словарь должен содержать:
- Разрешить произвольные нагрузки = YES
- Исключительные домены (укажите здесь свой домен http)
В Xcode 7 нам нужно сделать так:
В файле Info.plist добавьте:
- NSAppTransportSecurity Как словарь и ребенок как
- NSAllowsArbitraryLoads В качестве логического значения YES
Добавьте этот код в файл info.plist
:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Для тех, кто пришел сюда, пытаясь найти причину, по которой их WKWebView всегда белый и ничего не нагружает (точно так же, как описано здесь, как я могу заставить WKWebView работать быстро и для приложения macOS):
Если все наука о ракетах выше не работает, проверьте очевидное: настройки песочницы
Будучи новым для быстрого и cocoa, но довольно опытным в программировании, я потратил около 20 часов, чтобы найти это решение. Ни один из десятков hipster-iOS-учебных пособий и яблок-нот - ничего не упоминает этот маленький флажок.
По умолчанию 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/
Для Кордовы, если вы хотите добавить его в свой 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, пока у вас не будет времени для реализации правильного решения.
Посмотрите другие вопросы по меткам ios xcode ios9 ios10 app-transport-security или Задайте вопрос