NET::ERR_CLEARTEXT_NOT_PERMITTED: причины, исправление и защита от ошибки на Android

Разбираем ошибку NET::ERR_CLEARTEXT_NOT_PERMITTED: что она значит, почему возникает на Android, как исправить её для пользователей, разработчиков и владельцев сайтов, а также как защитить приложение и веб-ресурс.

Что означает ошибка NET::ERR_CLEARTEXT_NOT_PERMITTED

Ошибка NET::ERR_CLEARTEXT_NOT_PERMITTED появляется, когда Android-приложение пытается установить соединение по незашифрованному протоколу HTTP, а операционная система блокирует такой трафик. Термин «cleartext» (открытый текст) означает, что данные передаются без шифрования, и их может перехватить или изменить третья сторона. Android, начиная с версии 9 (API level 28), по умолчанию запрещает приложениям использовать cleartext-соединения, чтобы защитить пользователей от утечки личных данных, паролей, токенов и другой конфиденциальной информации.

Важно понимать: ошибка не означает, что сайт или сервер не работает. Если открыть тот же адрес в обычном браузере, например Chrome, страница, скорее всего, загрузится, хотя браузер может показать предупреждение «Не защищено». Проблема проявляется именно внутри приложений, использующих компонент WebView или собственные сетевые запросы. Это связано с тем, что браузеры имеют собственные правила безопасности, а Android для приложений применяет более строгую политику по умолчанию.

Ошибка может возникать не только при загрузке веб-страниц, но и при обращении к API, загрузке изображений, скриптов, стилей или других ресурсов по HTTP. Даже если основной URL указан как HTTPS, отдельные элементы страницы могут запрашиваться по незащищённому протоколу, что также вызовет блокировку.

Почему Android блокирует незашифрованный трафик

Решение Google запретить cleartext-трафик в приложениях связано с ростом угроз безопасности в мобильной экосистеме. Передача данных по HTTP означает, что информация идёт в открытом виде: злоумышленник в той же Wi-Fi-сети может перехватить логины, пароли, номера карт, личные сообщения или подменить содержимое ответа. HTTPS, в свою очередь, шифрует данные с помощью протоколов SSL/TLS, что делает перехват практически бесполезным.

Android 9 и более новые версии автоматически применяют запрет на cleartext для всех приложений, если разработчик явно не разрешил обратное. Это касается как WebView, так и обычных сетевых библиотек (OkHttp, Retrofit, Volley). Исключение сделано для системных приложений и некоторых предустановленных сервисов, но сторонние разработчики обязаны самостоятельно настраивать политику безопасности.

Такая политика вынуждает разработчиков переходить на HTTPS, что в долгосрочной перспективе повышает безопасность всей экосистемы. Однако на практике многие старые сайты, локальные серверы или тестовые окружения всё ещё используют HTTP, из-за чего и возникает ошибка. Понимание причин помогает выбрать правильный способ исправления: либо перевести ресурс на HTTPS, либо точечно разрешить cleartext для конкретных доменов.

Где чаще всего встречается ошибка

Ошибка NET::ERR_CLEARTEXT_NOT_PERMITTED наиболее характерна для приложений, которые используют Android WebView для отображения веб-контента. Это гибридные приложения, созданные на базе Cordova, Ionic, React Native, Flutter (если используется WebView), а также обычные приложения, встраивающие браузерный движок. Пользователь видит сообщение об ошибке вместо ожидаемой страницы, что часто воспринимается как сбой приложения.

Кроме WebView, ошибка возникает при прямых сетевых запросах к API, если сервер не поддерживает HTTPS. Например, приложение может обращаться к http://api.example.com/data, и Android заблокирует запрос. Также проблема появляется при работе с локальными серверами в процессе разработки: эмулятор Android обращается к хосту через http://10.0.2.2:3000, а физическое устройство — через локальный IP вида http://192.168.1.50:3000. Эти адреса не используют шифрование, поэтому по умолчанию блокируются.

Ещё один частый сценарий — редиректы. Пользователь открывает HTTPS-ссылку, но сервер перенаправляет на HTTP-версию страницы или ресурса. В этом случае ошибка возникает не сразу, а после перехода, что затрудняет диагностику. Также стоит учитывать, что на старых версиях Android (до 9) ошибка может не появляться, поэтому тестирование только на устаревших устройствах не выявит проблему.

Как исправить ошибку обычному пользователю

Если вы столкнулись с ошибкой в каком-либо приложении, но сайт при этом открывается в браузере, проблема кроется в политике безопасности Android, а не в вашем устройстве. Как обычный пользователь, вы не можете изменить настройки приложения, но есть несколько практических шагов.

Во-первых, попробуйте открыть тот же адрес в браузере Chrome, Firefox или другом. Если страница загружается, значит, сайт доступен, и вы можете пользоваться им через браузер. Во-вторых, проверьте, не устарело ли приложение: разработчики часто выпускают обновления, в которых исправляют ошибки с cleartext-трафиком. Обновите приложение через Google Play или App Store (если речь об iOS, там ошибка встречается реже).

В-третьих, если ошибка возникает в приложении, которое вы не можете обновить, свяжитесь с разработчиком и сообщите о проблеме. Опишите, что именно вы делали, когда появилась ошибка, и укажите версию Android. Разработчик сможет исправить конфигурацию приложения или перевести сервер на HTTPS.

Не рекомендуется пытаться «обойти» ошибку с помощью сторонних инструментов или модификации системных файлов — это может нарушить безопасность устройства и привести к утечке данных. Лучше дождаться официального исправления или использовать браузер.

Исправление для разработчиков: AndroidManifest.xml

Разработчики Android-приложений могут разрешить cleartext-трафик, изменив файл AndroidManifest.xml. Это самый простой способ, но он разрешает незашифрованные соединения для всего приложения, что не рекомендуется для production-сборок. Тем не менее, для тестирования или внутренних инструментов он может быть оправдан.

Чтобы включить поддержку cleartext, добавьте атрибут android:usesCleartextTraffic="true" в тег ``:

Если атрибут уже присутствует со значением false, измените его на true. После сохранения изменений пересоберите проект. Этот метод работает на всех версиях Android, но Google настоятельно рекомендует использовать HTTPS вместо разрешения cleartext. Включение usesCleartextTraffic делает приложение уязвимым для перехвата данных, поэтому используйте его только как временное решение.

Для более безопасного подхода используйте сетевую конфигурацию безопасности, которая позволяет разрешить cleartext только для определённых доменов. Это описано в следующем разделе.

Точечное разрешение cleartext через network_security_config.xml

Начиная с Android 7.0 (API level 24), разработчики могут использовать файл network_security_config.xml для точной настройки политики cleartext. Это позволяет разрешить HTTP-соединения только для конкретных доменов, не открывая доступ для всего приложения. Такой подход безопаснее, чем глобальное разрешение, и рекомендуется для случаев, когда часть ресурсов всё ещё работает по HTTP.

Создайте файл res/xml/network_security_config.xml со следующим содержимым:


        example.com

В этом примере разрешён cleartext для example.com и всех его поддоменов (благодаря includeSubdomains="true"). Вы можете добавить несколько элементов ` для разных доменов. Затем укажите этот файл в AndroidManifest.xml внутри тега `:

Этот метод особенно полезен, когда приложение обращается к нескольким API, и только один из них ещё не переведён на HTTPS. Вы ограничиваете риски, разрешая cleartext только для необходимых доменов, а остальной трафик остаётся защищённым. Помните, что для доменов с поддоменами нужно указывать includeSubdomains="true", иначе запросы к api.example.com будут заблокированы.

Перевод сайта на HTTPS как основное решение

Самый надёжный и рекомендуемый способ избавиться от ошибки NET::ERR_CLEARTEXT_NOT_PERMITTED — перевести сайт или API на HTTPS. Это решает проблему не только для Android-приложений, но и повышает доверие пользователей, улучшает позиции в поисковых системах и защищает данные от перехвата.

Для установки HTTPS необходимо получить SSL-сертификат. Современные сервисы, такие как Let's Encrypt, предоставляют бесплатные сертификаты, которые автоматически продлеваются. Многие хостинг-провайдеры, включая Kinsta, автоматически настраивают SSL для новых сайтов и позволяют включить принудительное перенаправление HTTP на HTTPS в панели управления. Если вы используете WordPress, можно установить плагин Really Simple SSL, который автоматически настроит редиректы и исправит смешанный контент.

После перехода на HTTPS важно проверить, что все ресурсы — изображения, скрипты, стили, шрифты — загружаются по HTTPS. Если на странице останутся ссылки на HTTP-ресурсы, браузер или WebView может заблокировать их как смешанный контент, что вызовет ошибки или некорректное отображение. Используйте относительные ссылки или обновите абсолютные URL на https://.

Для разработчиков API также необходимо настроить HTTPS на сервере. Это может потребовать обновления конфигурации веб-сервера (Nginx, Apache) и установки сертификата. После этого все запросы от Android-приложений будут шифроваться, и ошибка исчезнет.

Особенности отладки: редиректы, смешанный контент и локальные серверы

При исправлении ошибки важно учитывать, что проблема может быть не в основном URL, а в скрытых HTTP-запросах. Например, страница загружается по HTTPS, но внутри неё есть ` или

Типичные ошибки при исправлении и как их избежать

При попытке устранить ошибку разработчики часто допускают несколько типичных ошибок. Во-первых, они включают usesCleartextTraffic="true" в production-сборке, что ослабляет безопасность всего приложения. Это допустимо только для тестовых или внутренних приложений, но не для публичных продуктов, работающих с чувствительными данными.

Во-вторых, забывают указать поддомены в network_security_config.xml. Если ваш API находится на api.example.com, а вы разрешили cleartext только для example.com, запросы к API всё равно будут блокироваться. Используйте includeSubdomains="true" или добавляйте каждый поддомен отдельно.

В-третьих, тестируют только на старых версиях Android, где ошибка не воспроизводится. Обязательно проверяйте приложение на Android 9 и новее, так как именно там действует запрет по умолчанию. Также не стоит игнорировать редиректы: даже если ваш URL начинается с HTTPS, сервер может перенаправить на HTTP, и ошибка появится.

Наконец, некоторые разработчики пытаются решить проблему через настройки WebView, разрешая смешанный контент. Это может временно скрыть ошибку, но не устраняет корневую причину. Лучше исправить источник: перевести ресурс на HTTPS или точечно разрешить cleartext для конкретных доменов. Помните, что ошибка — это не просто досадная помеха, а сигнал о небезопасном соединении, и игнорирование его может привести к утечке данных.

Профилактика: как избежать ошибки в будущем

Чтобы не сталкиваться с ошибкой NET::ERR_CLEARTEXT_NOT_PERMITTED в будущем, следуйте нескольким рекомендациям. Для владельцев сайтов и API: всегда используйте HTTPS, настраивайте автоматическое перенаправление с HTTP на HTTPS и регулярно проверяйте, что все ресурсы загружаются по защищённому протоколу. Бесплатные сертификаты Let's Encrypt и современные хостинг-провайдеры делают этот процесс простым.

Для разработчиков Android: с самого начала проектируйте приложение с использованием HTTPS. В debug-сборках можно разрешить cleartext для локальных серверов, но в release-сборках обязательно отключайте его. Используйте network_security_config.xml для точечного разрешения, если без HTTP не обойтись, и планируйте миграцию на HTTPS.

Также регулярно проверяйте сторонние библиотеки и сервисы, к которым обращается приложение. Если какой-то из них использует HTTP, это может стать источником ошибки. Ведите документацию по всем сетевым зависимостям и следите за их обновлениями.

Наконец, тестируйте приложение на разных версиях Android, включая Android 9 и выше, чтобы вовремя обнаружить проблемы с cleartext. Используйте эмуляторы и реальные устройства. Соблюдение этих правил поможет создать безопасное и стабильное приложение, которое не будет блокироваться операционной системой.

Вопросы и ответы

Что означает ошибка NET::ERR_CLEARTEXT_NOT_PERMITTED?

Ошибка означает, что Android-приложение пытается установить соединение по незашифрованному протоколу HTTP, а операционная система блокирует такой трафик. Это защитный механизм, который предотвращает передачу данных в открытом виде. Ошибка чаще всего появляется в приложениях, использующих WebView, при обращении к HTTP-сайтам или API. В браузере тот же сайт может открываться, но с предупреждением о небезопасном соединении.

Почему ошибка возникает только на Android?

Начиная с Android 9 (API level 28), Google запретил приложениям использовать cleartext-трафик по умолчанию. Это сделано для повышения безопасности пользователей. Браузеры, такие как Chrome, имеют собственные правила и могут показывать предупреждения, но не блокировать доступ полностью. Ошибка уникальна для Android-приложений, особенно тех, которые используют WebView или собственные сетевые запросы.

Как исправить ошибку, если я обычный пользователь?

Если вы не разработчик, попробуйте открыть сайт в браузере — скорее всего, он загрузится. Обновите приложение, возможно, разработчик уже исправил проблему. Если ошибка остаётся, свяжитесь с поддержкой приложения и сообщите о проблеме. Не пытайтесь обойти блокировку с помощью сторонних инструментов — это может быть опасно для ваших данных.

Можно ли разрешить HTTP-трафик в приложении?

Да, разработчик может разрешить cleartext-трафик, добавив android:usesCleartextTraffic="true" в AndroidManifest.xml или настроив network_security_config.xml для конкретных доменов. Однако это снижает безопасность, поэтому рекомендуется использовать HTTPS. Глобальное разрешение cleartext нежелательно для production-приложений, особенно если они обрабатывают чувствительные данные.

Что такое network_security_config.xml и зачем он нужен?

Это файл конфигурации, который позволяет разработчикам задавать политику безопасности для сетевых соединений. С его помощью можно разрешить cleartext-трафик только для определённых доменов, не открывая доступ для всего приложения. Это более безопасный подход, чем глобальное разрешение. Файл создаётся в res/xml/ и подключается через атрибут android:networkSecurityConfig в AndroidManifest.xml.

Как перевести сайт на HTTPS, чтобы избежать ошибки?

Для перехода на HTTPS необходимо получить SSL-сертификат. Бесплатные сертификаты предоставляет Let's Encrypt. После установки сертификата настройте веб-сервер на использование HTTPS и включите автоматическое перенаправление с HTTP на HTTPS. Убедитесь, что все ресурсы (изображения, скрипты, стили) загружаются по HTTPS. Многие хостинг-провайдеры, например Kinsta, автоматически настраивают SSL и позволяют включить принудительный HTTPS в панели управления.

Почему ошибка появляется, даже если URL начинается с HTTPS?

Причина может быть в смешанном контенте: страница загружается по HTTPS, но внутри неё есть запросы к HTTP-ресурсам (изображения, скрипты, iframe). Android блокирует такие запросы. Также возможен редирект с HTTPS на HTTP. Проверьте все сетевые запросы через инструменты разработчика в браузере и исправьте источники, которые используют HTTP.