НейроАгент

Полное руководство по исключениям ATS в Info.plist

Узнайте, как настроить исключения App Transport Security в вашем iOS Info.plist для разрешения HTTP-соединений для определенных доменов, таких как example.com. Полное руководство с примерами кода.

Вопрос

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

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

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

НейроАгент

Чтобы включить HTTP-соединения для вашего домена в iOS, необходимо добавить исключение App Transport Security в файл Info.plist. Для example.com следует добавить конфигурацию NSExceptionDomains с установленным значением true для NSExceptionAllowsInsecureHTTPLoads, при этом опционально включая NSIncludesSubdomains для покрытия всех поддоменов.

Содержание

Понимание App Transport Security

App Transport Security (ATS) — это функция безопасности, представленная Apple, которая обеспечивает безопасные сетевые соединения между вашим iOS-приложением и серверами. Когда ваше приложение пытается загрузить ресурсы по HTTP (незащищенным соединениям), ATS блокирует запрос и отображает сообщение об ошибке, с которым вы столкнулись.

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

ATS включен по умолчанию для всех новых iOS-приложений и гарантирует, что все сетевые соединения используют HTTPS (безопасную передачу) с правильной проверкой сертификатов. Это помогает защитить данные пользователей и предотвратить атаки “человек посередине”.

Преимущества безопасности ATS включают:

  • Шифрование данных - вся связь шифруется
  • Проверка сертификатов - гарантирует подключение к легитимным серверам
  • Принудительное использование протоколов - требует современные версии TLS
  • Совершенная прямая секретность - предотвращает расшифровку перехваченного трафика

Однако существуют законные сценарии, когда вам могут потребоваться исключения, такие как:

  • Среды разработки с самоподписанными сертификатами
  • Устаревшие бэкенд-сервисы, которые еще не реализовали HTTPS
  • Сторонние сервисы, поддерживающие только HTTP
  • Локальные серверы разработки

Базовая конфигурация Info.plist для example.com

Чтобы разрешить HTTP-соединения для вашего домена example.com, вам нужно настроить файл Info.plist со следующей структурой:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Разбор конфигурации:

  1. NSAppTransportSecurity - Основной словарь, содержащий все настройки ATS
  2. NSExceptionDomains - Словарь, содержащий исключения для конкретных доменов
  3. example.com - Конкретный домен, для которого вы хотите разрешить HTTP-доступ
  4. NSExceptionAllowsInsecureHTTPLoads - Установлено в true для разрешения HTTP-соединений
  5. NSIncludesSubdomains - Установлено в true для автоматического включения всех поддоменов (например, api.example.com, www.example.com и т.д.)

Добавление конфигурации в Xcode:

У вас есть два основных метода добавления этой конфигурации:

Метод 1: Использование Interface Builder Xcode

  1. Откройте ваш проект в Xcode
  2. Выберите цель вашего проекта
  3. Перейдите на вкладку “Info”
  4. Нажмите кнопку “+”, чтобы добавить новую строку
  5. Найдите “App Transport Security Settings”
  6. Нажмите треугольник раскрытия, чтобы развернуть
  7. Снова нажмите кнопку “+” и выберите “Exception Domains”
  8. Добавьте имя вашего домена в качестве ключа
  9. Установите значения для ключей исключений

Метод 2: Редактирование Info.plist как исходного кода

  1. Щелкните правой кнопкой мыши по Info.plist в навигаторе проекта
  2. Выберите “Open As” → “Source Code”
  3. Добавьте XML-конфигурацию, показанную выше
  4. Сохраните файл

Расширенные параметры конфигурации

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

Управление минимальной версией TLS

xml
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>

Это позволяет указать минимально требуемую версию TLS для домена. По умолчанию ATS требует TLS 1.2 или выше.

Управление прямой секретностью

xml
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>

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

Типы исключений

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

Для HTTP-загрузок от сторонних источников:

xml
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>

Для вашего собственного сервера:

xml
<key>NSAllowsArbitraryLoads</key>
<true/>

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

Конфигурация для нескольких доменов

Если вам нужно разрешить несколько доменов:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
        <key>legacy.api.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

Распространенные проблемы и устранение неполадок

Проблемы с форматом домена

Одна из самых распространенных ошибок - использование неправильного формата домена в Info.plist:

Неправильно:

xml
<key>http://example.com</key>

Правильно:

xml
<key>example.com</key>

Домен должен быть указан без префиксов http:// или https://.

Проблемы с вложенной конфигурацией

Как отмечено в результатах исследования, “Ключ NSExceptionAllowsInsecureHTTPLoads находится в неправильном месте. Он должен быть дочерним элементом ключа домена, а не дочерним элементом ключа Exception Domains.”

Неправильно:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Правильно:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Проблемы с кэшированием

Исключения ATS могут не вступить в силу немедленно из-за кэширования. Попробуйте эти решения:

  1. Очистите папку сборки (Product → Clean Build Folder)
  2. Перезапустите Xcode
  3. Удалите и переустановите приложение на вашем устройстве/симуляторе

Проблемы с учетом регистра

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

xml
<key>Example.com</key>  <!-- Работает, но не рекомендуется -->
<key>example.com</key>  <!-- Рекомендуемый формат -->

Лучшие практики и соображения безопасности

Подход “Безопасность прежде всего”

Хотя исключения иногда необходимы, всегда отдавайте приоритет безопасности:

  1. Используйте HTTPS, когда это возможно - большинство сервисов теперь поддерживают HTTPS
  2. Ограничивайте исключения конкретными доменами - избегайте использования NSAllowsArbitraryLoads
  3. Реализуйте закрепление сертификатов для критически важных сервисов
  4. Следите за обновлениями безопасности - Apple постоянно улучшает ATS

Среды разработки и производства

Рассмотрите разные конфигурации для разработки и производства:

Разработка (Info.plist):

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

Производство (Info.plist):

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Тестирование вашей конфигурации

После добавления исключений ATS тщательно протестируйте:

  1. Проверьте, что HTTP-запросы работают для указанных доменов
  2. Убедитесь, что HTTPS по-прежнему работает для других доменов
  3. Тестируйте на реальных устройствах, а не только на симуляторах
  4. Проверяйте сетевые журналы с помощью Network Activity Viewer в Xcode

План постепенного перехода

Если вы работаете с устаревшими сервисами, планируйте переход на HTTPS:

  1. Этап 1: Добавьте исключения ATS для HTTP-доменов
  2. Этап 2: Реализуйте HTTPS на бэкенде
  3. Этап 3: Удалите исключения ATS и принудительно используйте HTTPS
  4. Этап 4: Реализуйте дополнительные меры безопасности

Альтернативные подходы

Использование исключений App Transport Security для медиа

Если вам нужно загружать медиаконтент из HTTP-источников, рассмотрите использование исключений, специфичных для медиа:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoadsForMedia</key>
    <true/>
</dict>

Это разрешает HTTP-соединения специально для медиаконтента, сохраняя безопасность для других сетевых запросов.

Использование фреймворка Network Extension

Для сложных сетевых сценариев рассмотрите фреймворк Network Extension от Apple, который обеспечивает более детальный контроль над сетевым трафиком и политиками безопасности.

Сторонние сетевые библиотеки

Некоторые сторонние сетевые библиотеки предоставляют собственные параметры конфигурации ATS и могут лучше обрабатывать крайние случаи, чем нативная реализация iOS.


Заключение

Чтобы устранить ошибку “Transport security has blocked a cleartext HTTP” для вашего домена example.com, вам нужно настроить ваш Info.plist с правильными исключениями App Transport Security. Ключевые настройки:

  1. Добавьте словарь NSAppTransportSecurity в ваш Info.plist
  2. Включите NSExceptionDomains с именем вашего домена
  3. Установите NSExceptionAllowsInsecureHTTPLoads в true
  4. При необходимости добавьте NSIncludesSubdomains для покрытия всех поддоменов

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

Для большинства разработчиков конфигурация, показанная в базовом разделе, будет достаточной для разрешения HTTP-соединений с example.com при сохранении безопасности для всех других доменных соединений.

Источники

  1. Stack Overflow - Transport security has blocked a cleartext HTTP
  2. Apple Developer Forums - Application Transport Security
  3. iOS Brain - App Transport Security has blocked a cleartext HTTP
  4. Google Developers - App Transport Security
  5. Stack Overflow - How to add NSExceptionDomains to plist
  6. CocoaCasts - How To Add App Transport Security Exception Domains
  7. Hacking with Swift - How to handle the HTTPS requirements in iOS with App Transport Security
  8. Apple Developer Documentation - NSExceptionDomains