Безопасность транспорта заблокировала простой текст HTTP
Какую настройку необходимо установить в мой info.plist
, чтобы включить режим HTTP в соответствии со следующим сообщением об ошибке?
Безопасность транспорта заблокировала ресурс netartext HTTP (http://) поскольку он небезопасен. Временные исключения можно настроить через файл вашего приложения Info.plist.
Предположим, что мой домен example.com
.
Ответы
Ответ 1
Если вы используете 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>
Ответ 2
Использовать NSAppTransportSecurity:
Вы должны установить ключ NSAllowsArbitraryLoads на ДА в словаре NSAppTransportSecurity в файле info.plist.
Ответ 3
Вот настройки визуально:
Ответ 4
Посмотреть сообщение на форуме 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 файл, поэтому вы можете размещать этот код более или менее внутри файла.
Ответ 5
Это было протестировано и работало над семенами 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.
Ответ 6
Это быстрый обходной путь (но не рекомендуется), чтобы добавить это в 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 с большим количеством вещей, объясненных относительно безопасности
Оставив первоначальный ответ по историческим причинам и фазе разработки
Ответ 7
Для тех из вас, кто хочет больше контекста на , почему это происходит, помимо того, как его исправить, читайте ниже.
С введением 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
.
Чтобы узнать больше о ключах, упомянутых выше, прочитайте этот уже упомянутый технот.
Ответ 8
Мне не нравится редактировать plist напрямую. Вы можете легко добавить его в plist с помощью GUI:
Ответ 9
Для этого есть два решения:
Решения 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-соединения.
Ответ 10
Безопасность транспорта доступна на iOS 9.0 или новее. У вас может быть это предупреждение при попытке вызвать WS внутри вашего приложения:
Application Transport Security заблокировала загрузку ресурса с открытым текстом HTTP (http://), поскольку она небезопасна. Временные исключения могут быть настроены через ваш файл Info.plist приложения.
Добавление следующего в ваш Info.plist отключит ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Ответ 11
Пример разработки
Вот скриншот plist, который сохраняет ATS intact (= secure), но позволяет подключаться к localhost с помощью HTTP вместо HTTPS. Он работает в Xcode 7.1.1.
Ответ 12
Это тоже работает для меня; просто скопируйте и вставьте следующее в свой файл 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
Перейдите в свой Info.plist
- Щелкните правой кнопкой мыши на пустое пространство и нажмите "Добавить строку"
- Введите имя ключа как NSAppTransportSecurity, под ним
- Выберите "Исключительные домены", добавьте новый элемент в этот
- Запишите свое доменное имя, которое необходимо получить.
- Измените тип домена из строки в словарь, добавьте новый элемент
- NSTemporaryExceptionAllowsInsecureHTTPLoads, который будет логическим с истинным значением.
Ответ 14
Выяснив, какие настройки можно использовать автоматически, как указано в этой технологии:
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
Ответ 15
По словам Apple, в целом отключение ATS приведет к отклонению приложения, если у вас нет веских оснований для этого. Даже тогда вы должны добавить исключения для доменов, к которым вы можете безопасно получить доступ.
У Apple есть отличный инструмент, который подскажет вам, какие настройки использовать: В терминале введите
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
и nscurl проверит, не провалился ли этот запрос, а затем попробуйте различные настройки и сообщите вам, какой именно пароль и что делать. Например, для некоторых сторонних URL-адресов, которые я посещаю, эта команда сообщила мне, что этот словарь проходит:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
Чтобы провести различие между вашими собственными сайтами и сторонними сайтами, которые находятся вне вашего контроля, используйте, например, ключ NSThirdPartyExceptionRequiresForwardSecrecy.
Ответ 16
В swift 4 и xocde 10 измените NSAllowsArbitraryLoads на Allow Произвольные загрузки. так это будет выглядеть так:
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key><true/>
</dict>
Ответ 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>
Это может быть немного неуверенно, но я не нашел других решений.
Ответ 18
ПРИМЕЧАНИЕ. Область исключений в вашем 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>
Ответ 19
Использование:
Добавьте новый элемент NSAppTransportSecurity в файл plist с типом Словарь, затем добавьте подтекст NSAllowsArbitraryLoads в словаре типа Boolean и установите значение bool YES. Это работает для меня.
Ответ 20
Возможно, стоит упомянуть, как туда добраться...
Info.plist является одним из файлов ниже Main.storyboard или viewController.swift.
Когда вы нажимаете на него в первый раз, он обычно находится в формате таблицы, поэтому щелкните правой кнопкой мыши файл и "откройте как" исходный код, а затем добавьте код ниже в конец, т.е.:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
Скопируйте код чуть выше
"</dict>
</plist>"
который находится в конце.
Ответ 21
Обновление для Xcode 7.1, перед проблемой 27.10.15:
Новое значение в Info.plist - это "Параметры безопасности приложения".
Оттуда этот словарь должен содержать:
- Разрешить произвольные нагрузки = YES
- Исключительные домены (укажите здесь свой домен http)
Ответ 22
В Xcode 7 нам нужно сделать так:
В файле Info.plist добавьте:
- NSAppTransportSecurity Как словарь и ребенок как
- NSAllowsArbitraryLoads В качестве логического значения YES
Ответ 23
Добавьте этот код в файл info.plist
:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Ответ 24
Для тех, кто пришел сюда, пытаясь найти причину, по которой их WKWebView всегда белый и ничего не нагружает (точно так же, как описано здесь, как я могу заставить WKWebView работать быстро и для приложения macOS):
Если все наука о ракетах выше не работает, проверьте очевидное: настройки песочницы
Будучи новым для быстрого и cocoa, но довольно опытным в программировании, я потратил около 20 часов, чтобы найти это решение. Ни один из десятков hipster-iOS-учебных пособий и яблок-нот - ничего не упоминает этот маленький флажок.
Ответ 25
По умолчанию iOS поддерживает только HTTPS API. Поскольку HTTP не является безопасным, вам придется отключить безопасность транспорта приложения. Есть два способа отключить ATS:
1. Добавьте исходный код в info.plist проекта и добавьте следующий код в корневой тег.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2. Использование информации о проекте.
Нажмите на проект в левой панели, выберите проект в качестве цели и выберите вкладку информации. Вы должны добавить словарь в следующей структуре.
Ответ 26
Использование NSExceptionDomains
может не применять эффект одновременно из-за того, что целевой сайт может загружать ресурсы (например, js
файлы) из внешних доменов поверх http
. Его можно решить, добавив эти внешние домены в NSExceptionDomains
.
Чтобы проверить, какие ресурсы не могут быть загружены, попробуйте использовать удаленную отладку. Вот учебник: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
Ответ 27
Для Кордовы, если вы хотите добавить его в свой ios.json, сделайте следующее:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
И он должен быть внутри:
"*-Info.plist": {
"parents": {
}
}
Ответ 28
Как отмечали многие, это проблема с функцией iOS 9.0. Они добавили что-то вроде App Transport Security, и я тоже был раздражен, когда он нарушил мои приложения.
Вы можете перевязать его с помощью ключа NSAllowsArbitraryLoads к YES в словаре NSAppTransportSecurity в вашем файле .plist, но в конечном итоге вам нужно будет переписать код, который формирует ваши URL, чтобы сформировать префикс HTTPS://.
Apple переписала класс NSUrlConnection в iOS 9.0. Вы можете прочитать об этом в NSURLConnection.
Кроме того, вам, возможно, придется отказаться от iOS 9.0, пока у вас не будет времени для реализации правильного решения.