Błąd ERR_CLEARTEXT_NOT_PERMITTED to problem, który może napotkać wielu deweloperów aplikacji Android, szczególnie przy korzystaniu z WebView. Dowiedz się, jakie są jego główne przyczyny i jak go skutecznie naprawić, aby zapewnić bezpieczny transfer danych za pomocą HTTPS. Poznaj najlepsze praktyki konfiguracji bezpieczeństwa sieci w aplikacjach mobilnych i uniknij nieszyfrowanego ruchu HTTP.

Co to jest błąd NET::ERR_CLEARTEXT_NOT_PERMITTED?

Błąd NET::ERR_CLEARTEXT_NOT_PERMITTED pojawia się, gdy aplikacja z Androidem próbuje uzyskać dostęp do strony internetowej przez nieszyfrowane połączenie HTTP. System Android blokuje takie działania, aby zapewnić ochronę wrażliwych danych użytkownika. Problem ten dotyczy wyłącznie aplikacji wykorzystujących Android System Webview i nie występuje w typowych przeglądarkach.

Od wersji 9.0 Android nie obsługuje domyślnie połączeń cleartext, co oznacza konieczność korzystania z zaszyfrowanych połączeń HTTPS zamiast HTTP. Cleartext to transmisja danych bez szyfrowania, narażająca je na podsłuch czy manipulacje ze strony osób trzecich. Takie niezabezpieczone dane mogą prowadzić do ich wycieku oraz umożliwiać wprowadzenie nieautoryzowanych treści.

Z tego powodu kluczowe jest dbanie o konfigurację bezpieczeństwa sieci w aplikacjach na Androida i unikanie używania niezabezpieczonych adresów URL. Wdrożenie zasad szyfrowania komunikacji pozwala uniknąć problemów związanych z blokowaniem HTTP i lepiej zabezpiecza dane użytkowników.

Przyczyny błędu NET::ERR_CLEARTEXT_NOT_PERMITTED

Błąd NET::ERR_CLEARTEXT_NOT_PERMITTED pojawia się, gdy aplikacje na Androidzie próbują przesyłać dane w formie niezaszyfrowanej. Jeżeli strona korzysta z protokołu HTTP zamiast zabezpieczonego HTTPS, system Android blokuje taki ruch, co skutkuje tym błędem. Od wersji 9.0 (API level 28), domyślnie wyłączono wsparcie dla cleartext, wymuszając używanie połączeń HTTPS.

Głównymi przyczynami tego problemu są nieszyfrowane adresy URL oraz próby komunikacji aplikacji z serwerami za pomocą ryzykownych protokołów:

  • nieszyfrowane adresy URL,
  • próby komunikacji aplikacji z serwerami za pomocą ryzykownych protokołów.

Takie działania mogą prowadzić do przechwycenia lub manipulacji danymi. Dlatego kluczowe jest stosowanie szyfrowania danych dla ochrony poufnych informacji użytkowników.

Cleartext jest szczególnie narażony na ataki typu man-in-the-middle oraz inne zagrożenia cybernetyczne. Zaleca się więc implementację HTTPS we wszystkich aplikacjach mobilnych, co zwiększa bezpieczeństwo przesyłanych danych i minimalizuje ryzyko ich wycieku czy nieautoryzowanego dostępu.

Dla deweloperów oznacza to konieczność wprowadzenia zmian w kodzie:

  • zamiana adresów URL na wersję z HTTPS – zapewnia bezpieczne połączenia;
  • odpowiednia konfiguracja plików takich jak AndroidManifest.xml i network_security_config.xml – pozwala na zgodność z nowoczesnymi standardami ochrony.

Rola WebView w błędzie NET::ERR_CLEARTEXT_NOT_PERMITTED

WebView odgrywa kluczową rolę w pojawianiu się błędu NET::ERR_CLEARTEXT_NOT_PERMITTED w aplikacjach na Androida. Jest to komponent umożliwiający wyświetlanie stron internetowych bezpośrednio w aplikacji. Problem pojawia się, gdy aplikacja próbuje załadować stronę przez nieszyfrowane połączenie HTTP, co skutkuje wygenerowaniem wspomnianego błędu. Dzieje się tak, ponieważ Android dla bezpieczeństwa blokuje dostęp do zasobów poprzez nieszyfrowany protokół.

Od wersji 9.0 systemu Android, połączenia cleartext są domyślnie wyłączone w WebView. Oznacza to konieczność wykorzystywania bezpiecznych połączeń HTTPS we wszystkich żądaniach, aby uniknąć problemów z bezpieczeństwem. Niezabezpieczone połączenia HTTP niosą ryzyko przechwycenia lub modyfikacji danych przez osoby trzecie, co podkreśla potrzebę starannej konfiguracji i stosowania bezpiecznych praktyk sieciowych przy korzystaniu z WebView.

Deweloperzy powinni skoncentrować się na zmianach w ustawieniach swoich aplikacji, by obsługiwały jedynie szyfrowane połączenia HTTPS. Warto dokonać odpowiednich zmian w plikach konfiguracyjnych takich jak:

  • AndroidManifest.xml – plik konfiguracyjny aplikacji Android;
  • network_security_config.xml – plik do zarządzania ustawieniami bezpieczeństwa sieciowego.

Dzięki temu aplikacje będą zgodne z nowoczesnymi standardami bezpieczeństwa i unikną problemów związanych z ładowaniem treści przez nieszyfrowane protokoły w WebView.

Konfiguracja bezpieczeństwa sieci dla aplikacji Android

Konfigurowanie zabezpieczeń sieciowych w aplikacjach Android ma fundamentalne znaczenie dla ochrony danych użytkowników. Właściwe ustawienia umożliwiają kontrolowanie połączeń, co pozwala unikać problemów związanych z nieszyfrowanymi transmisjami. Aplikacje mogą wykorzystywać plik network_security_config.xml, aby dostosować politykę bezpieczeństwa, umożliwiając nieszyfrowane protokoły dla wybranych domen, co jest przydatne, gdy wymagana jest większa elastyczność.

Atrybut cleartextTrafficPermitted="true" zezwala na dostęp do zasobów poprzez nieszyfrowane połączenia HTTP, ale jego stosowanie powinno być ograniczone do uzasadnionych sytuacji. Aby lepiej kontrolować ruch sieciowy, można edytować plik AndroidManifest.xml i skonfigurować element usesCleartextTraffic. To pozwala deweloperowi precyzyjnie określić zasady łączności aplikacji z Internetem.

Pliki związane z projektem zwykle znajdują się w katalogach takich jak:

  • Res/xml,
  • Manifests.

W tych lokalizacjach programista może modyfikować pod-elementy jak Application oraz Domain. Dzięki temu możliwe jest unikanie błędów typu NET::ERR_CLEARTEXT_NOT_PERMITTED i zwiększenie poziomu bezpieczeństwa aplikacji poprzez ochronę przed zagrożeniami wynikającymi z używania niezabezpieczonych protokołów komunikacyjnych.

Jak naprawić błąd NET::ERR_CLEARTEXT_NOT_PERMITTED

Aby naprawić błąd NET::ERR_CLEARTEXT_NOT_PERMITTED, warto podjąć kilka kroków w kierunku zapewnienia bezpiecznych połączeń sieciowych w aplikacjach na Androida. Kluczowe jest stosowanie protokołu HTTPS zamiast HTTP, co chroni przed przesyłaniem danych w formie niezaszyfrowanej. Można to osiągnąć poprzez przekierowanie ruchu z HTTP na HTTPS oraz aktywację trybu wyłącznie HTTPS.

Zmiany w ustawieniach aplikacji można dokonać, edytując plik AndroidManifest.xml. Warto dodać atrybut usesCleartextTraffic="false" do sekcji <application>, co uniemożliwi nieszyfrowane połączenia i zwiększy bezpieczeństwo informacji użytkowników.

Dodatkowo należy skonfigurować plik network_security_config.xml, aby ustalić zasady bezpieczeństwa dla poszczególnych domen. Dzięki temu możliwe jest dodanie zaufanych domen do białej listy oraz dostosowanie polityki bezpieczeństwa sieciowego do specyfiki aplikacji.

Takie działania pomagają uniknąć błędu NET::ERR_CLEARTEXT_NOT_PERMITTED i zapewniają bezpieczną wymianę danych między aplikacją a serwerem dzięki zastosowaniu szyfrowania. Implementacja tych zmian znacząco podnosi poziom zabezpieczeń i zmniejsza ryzyko ataków cybernetycznych, takich jak man-in-the-middle.

Wymuś użycie HTTPS na stronie

Wymuszanie korzystania z HTTPS na stronie to istotny krok w zabezpieczaniu przesyłanych danych między użytkownikami a serwerem. Przejście z HTTP na HTTPS wiąże się z szyfrowaniem, które chroni przed przechwytywaniem i manipulacją danymi przez nieuprawnione osoby. Aby zapewnić korzystanie z HTTPS, można skonfigurować serwer tak, żeby automatycznie przekierowywał wszystkie żądania HTTP do wersji zabezpieczonej.

Na przykład wiele serwerów umożliwia ustawienie właściwych reguł w pliku konfiguracyjnym lub za pomocą skryptów:

  • Apache – wystarczy zmodyfikować plik .htaccess, dodając zasady kierujące ruch z HTTP na HTTPS;
  • Nginx – stosuje się dyrektywy return lub rewrite w konfiguracji.

Dodatkowo wymuszenie HTTPS może być aktywowane poprzez ustawienia DNS lub za pośrednictwem usług takich jak Cloudflare, które oferują automatyczne przekierowania i dodatkowe funkcje bezpieczeństwa.

Wprowadzenie trybu wyłącznie HTTPS znacznie podnosi poziom ochrony sieciowej. Zapewnia, że dostęp do zasobów strony odbywa się jedynie poprzez odpowiednio szyfrowane połączenia. Nawet przypadkowe próby użycia nieszyfrowanych protokołów zostaną albo zablokowane, albo przekierowane na bezpieczne ścieżki.

Migracja do HTTPS zwiększa nie tylko bezpieczeństwo witryny, ale także jej widoczność w wynikach Google. Algorytmy wyszukiwarki faworyzują strony korzystające z tego protokołu ze względu na ich większą wiarygodność oraz ochronę prywatności użytkowników.

Zmodyfikuj AndroidManifest.xml

Aby poradzić sobie z błędem NET::ERR_CLEARTEXT_NOT_PERMITTED, można wprowadzić zmiany w pliku AndroidManifest.xml. Najpierw znajdź ten plik w katalogu Manifests swojego projektu Android i otwórz go. Następnie umieść atrybut android:usesCleartextTraffic="true" wewnątrz elementu <application>. Dzięki temu aplikacja zyska możliwość korzystania z nieszyfrowanych połączeń HTTP, co pozwoli wyeliminować wspomniany problem.

Android Manifest odgrywa istotną rolę w konfiguracji aplikacji, zawierając kluczowe informacje o jej funkcjonowaniu. Dodanie usesCleartextTraffic sprawia, że WebView może ładować treści bez ograniczeń narzuconych przez system zabezpieczeń. Niemniej jednak, warto stosować ten atrybut jedynie wtedy, gdy jest to absolutnie konieczne dla prawidłowego działania aplikacji.

Dobrze jest także rozważyć inne metody podnoszące poziom bezpieczeństwa aplikacji:

  • dodanie domen do białej listy – można to zrobić za pomocą network_security_config.xml;
  • przejście na szyfrowane połączenia HTTPS – zapewnia lepszą ochronę danych użytkowników;
  • zgodność z nowoczesnymi standardami prywatności – planuj konfigurację zabezpieczeń sieciowych z myślą o ochronie danych użytkowników i zgodności z przepisami.

Dodaj domenę do białej listy za pomocą network_security_config.xml

Aby dodać domenę do białej listy w pliku network_security_config.xml, można ominąć ograniczenia związane z nieszyfrowanymi połączeniami HTTP. Na początek należy utworzyć lub zmodyfikować istniejący plik network_security_config.xml, który zazwyczaj znajduje się w katalogu res/xml projektu Android. Ten plik pozwala określić zasady dla poszczególnych domen, które mają zezwalać na nieszyfrowany ruch.

Wewnątrz tego dokumentu dodaj element <domain-config> z atrybutem cleartextTrafficPermitted=”true”, aby umożliwić nieszyfrowane połączenia dla konkretnej domeny. Przykładowo:


<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">example.com</domain>
  </domain-config>
</network-security-config>

Taka konfiguracja pozwala aplikacji korzystać z nieszyfrowanych połączeń HTTP zarówno dla example.com, jak i jej subdomen. Niemniej jednak, warto stosować tę opcję tylko wtedy, gdy jest to absolutnie konieczne i bezpieczne, ponieważ może zwiększać ryzyko związane z bezpieczeństwem danych.

Po przygotowaniu lub edycji pliku network_security_config.xml, trzeba go podłączyć do aplikacji przez odpowiednią zmianę w pliku AndroidManifest.xml. W sekcji <application> dodaj atrybut android:networkSecurityConfig=”@xml/network_security_config”. Przykład:


<application
  android:networkSecurityConfig="@xml/network_security_config"
  ... >

Dzięki tym krokom aplikacja będzie działała poprawnie bez wystąpienia błędu NET::ERR_CLEARTEXT_NOT_PERMITTED podczas korzystania z wybranych zasobów sieciowych przez HTTP. Rozwiązanie to powinno być stosowane rozważnie, zwłaszcza gdy użycie HTTPS nie jest możliwe ani praktyczne.

Autor
Emil Serafiński
Entuzjasta open source, który od lat składa domowe serwery na Raspberry Pi i zarządza nimi przez Kubernetes, testując przy okazji najnowsze dystrybucje Linuxa. Po godzinach optymalizuje workflow na klawiaturach mechanicznych Keychron, śledzi premiery ThinkPadów z procesorami AMD Ryzen i eksperymentuje z modułami Arduino do automatyzacji smart-home. Uwielbia analizować, jak sztuczna inteligencja od OpenAI i Google DeepMind wpływa na ekosystem chmury i produktywność programistów.