it-swarm.com.de

Android 8: Klartext-HTTP-Verkehr nicht zulässig

Ich hatte Berichte von Nutzern mit Android 8, dass meine App (die Back-End-Feeds verwendet) keinen Inhalt anzeigt. Nach einer Untersuchung habe ich folgende Ausnahme festgestellt, die auf Android 8 aufgetreten ist:

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException Java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.Android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.Java:115)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.Java:458)
at com.Android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.Java:127)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.Java:207)
at com.deiw.Android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.Java:102)
at com.deiw.Android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.Java:88)
at Android.os.AsyncTask$2.call(AsyncTask.Java:333)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:245)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
at Java.lang.Thread.run(Thread.Java:764)

(Ich habe den Paketnamen, die URL und andere mögliche Bezeichner entfernt.)

Auf Android 7 und niedriger funktioniert alles, ich setze Android:usesCleartextTraffic in Manifest nicht (und das Setzen auf true hilft nicht, das ist der Standardwert), ich auch nicht Verwenden Sie die Netzwerksicherheitsinformationen. Wenn ich NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() aufrufe, wird false für Android 8, true für ältere Versionen mit derselben APK-Datei zurückgegeben. Ich habe versucht, dies in Google-Informationen zu Android O zu erwähnen, aber ohne Erfolg.

633
david.s

Gemäß Netzwerksicherheitskonfiguration -

Ab Android 9 (API-Stufe 28) ist die Klartextunterstützung standardmäßig deaktiviert.

Schauen Sie sich auch - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/ an

Option 1 -

Erstelle die Datei res/xml/network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission Android:name="Android.permission.INTERNET" />
    <application
        ...
        Android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>

Option 2 -

Android: usingCleartextTraffic Doc

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission Android:name="Android.permission.INTERNET" />
    <application
        ...
        Android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

Auch als @ david.s Antwort wies darauf hin, Android:targetSandboxVersion kann auch ein Problem sein -

Nach Manifest Docs -

Android:targetSandboxVersion

Die Ziel-Sandbox für diese App. Je höher die Versionsnummer der Sandbox ist, desto höher ist die Sicherheitsstufe. Der Standardwert ist 1; Sie können es auch auf 2 setzen. Wenn Sie dieses Attribut auf 2 setzen, wechselt die App zu einer anderen SELinux-Sandbox. Die folgenden Einschränkungen gelten für eine Sandbox der Stufe 2:

  • Der Standardwert von usesCleartextTraffic in der Netzwerksicherheitskonfiguration ist false.
  • Uid-Sharing ist nicht gestattet.

Also Option 3 -

Wenn Sie Android:targetSandboxVersion in <manifest> haben, reduzieren Sie es auf 1

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest Android:targetSandboxVersion="1">
    <uses-permission Android:name="Android.permission.INTERNET" />
    ...
</manifest>
1363

Im AndroidManifest habe ich diesen Parameter gefunden:

Android:networkSecurityConfig="@xml/network_security_config"

und @ xml/network_security_config ist in network_security_config.xml definiert als:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

ich habe nur cleartextTrafficPermitted auf true geändert

74
byOnti

Möglicherweise möchten Sie beim Debuggen nur Klartext zulassen, aber die Sicherheitsvorteile der Zurückweisung von Klartext in der Produktion beibehalten. Dies ist nützlich für mich, da ich meine App auf einem Entwicklungsserver teste, der https nicht unterstützt. So erzwingen Sie https in der Produktion, erlauben jedoch Klartext im Debug-Modus:

In build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

Im Anwendungstag in AndroidManifest.xml

Android:usesCleartextTraffic="${usesCleartextTraffic}"
47
Tyler

Ändern Sie Ihre URLs von HTTP ZU HTTPS;

Es funktioniert!!!

42
eLi

Mein Problem in Android 9 war das Navigieren in einer Webansicht über Domains mit http Die Lösung von diese Antwort

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

und:

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
42
Pablo Cegarra
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

In dem oben angegebenen Vorschlag habe ich meine URL als http://xyz.abc.com/mno/ angegeben.

Ich habe das auf xyz.abc.com geändert, dann hat es funktioniert.

28
Lorence

Es könnte für jemanden nützlich sein.

Wir hatten vor kurzem das gleiche Problem für Android 9, mussten jedoch nur einige URLs in WebView anzeigen, was nichts Besonderes war. Das Hinzufügen von Android:usesCleartextTraffic="true" zu Manifest hat funktioniert, aber wir wollten die Sicherheit der gesamten App dafür nicht gefährden. Der Fix bestand also darin, die Links von http auf https zu ändern.

19
sparkly_frog

Ok, das ist ⇒⇒ NICHT ⇐⇐ die Tausenderwiederholung von füge es deinem Manifest hinzu , aber ein Hinweis, auf dem es basiert dies, aber geben Sie Zusatznutzen (und vielleicht einige Hintergrundinformationen).

Android hat eine Art Überschreibfunktionalität für das src-Directory.

Standardmäßig haben Sie

/app/src/main

Sie können jedoch zusätzliche Verzeichnisse hinzufügen, um Ihre AndroidManifest.xml-Datei zu überschreiben. So funktioniert es:

  • Erstellen Sie das Verzeichnis /app/src/debug
  • Im Inneren erstellen Sie die AndroidManifest.xml

In dieser Datei müssen Sie nicht alle Regeln einfügen, aber nur die, die Sie gerne überschreiben aus Ihrer/app/src/main/AndroidManifest.xml

Hier ein Beispiel, wie es für die angeforderte CLEARTEXT-Berechtigung aussieht:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.yourappname">

    <application
            Android:usesCleartextTraffic="true"
            Android:name=".MainApplication"
            Android:label="@string/app_name"
            Android:icon="@mipmap/ic_launcher"
            Android:allowBackup="false"
            Android:theme="@style/AppTheme">
    </application>

</manifest>

Mit diesem Wissen ist es jetzt einfach für Sie, Ihre Berechtigungen abhängig von Ihrer debug | main | release -Umgebung mit 1,2,3 zu überlasten.

Der große Vorteil dabei ist, dass Sie kein Debug-Material in Ihrem Produktionsmanifest haben und eine klare und einfach zu wartende Struktur haben

15
suther

Für React native Projekte

Es wurde bereits auf RN 0.59 festgelegt. Sie finden unter pgrade-Unterschied von 0.58.6 auf 0.59 Sie können es anwenden, ohne Ihre RN-Version zu aktualisieren. Führen Sie dazu die folgenden Schritte aus:

Dateien erstellen:

Android/app/src/ debuggen /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

Android/app/src/ debug /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:tools="http://schemas.Android.com/tools">

  <uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      Android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Überprüfen Sie die akzeptierte Antwort, um die Grundursache zu ermitteln.

8

Okay, ich habe das herausgefunden. Es liegt am Manifest-Parameter Android:targetSandboxVersion="2", den ich hinzugefügt habe, weil wir auch eine Instant App-Version haben - es sollte sichergestellt werden, dass Benutzer, die von der Instant App auf die reguläre App upgraden, ihre Daten bei der Übertragung nicht verlieren. Wie die vage Beschreibung jedoch andeutet:

Gibt die Ziel-Sandbox an, die diese App verwenden möchte. Höhere Sanbox-Versionen bieten ein höheres Maß an Sicherheit.

Der Standardwert dieses Attributs ist 1.

Es werden natürlich auch neue Sicherheitsrichtlinien hinzugefügt, zumindest für Android 8.

8
david.s

Um diese verschiedenen Antworten auf Xamarin.Android anzuwenden, können Sie Attribute auf Klassen- und Baugruppenebene verwenden, anstatt den AndroidManifest.xml manuell zu bearbeiten.

Internetgenehmigung ist natürlich erforderlich (duh ..):

[Assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Hinweis: In der Regel werden Attribute auf Assembly-Ebene zu Ihrer AssemblyInfo.cs -Datei hinzugefügt, aber jede Datei unter using und über namespace funktioniert.

Anschließend können Sie in Ihrer Anwendungsunterklasse (erstellen Sie eine, falls erforderlich) NetworkSecurityConfig mit einem Verweis auf eine Resources/xml/ZZZZ.xml -Datei hinzufügen:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Erstellen Sie eine Datei im Ordner Resources/xml (erstellen Sie ggf. den Ordner xml).

Beispiel xml/network_security_config -Datei, nach Bedarf anpassen (siehe andere Antworten)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Sie können auch den Parameter UsesCleartextTraffic für ApplicationAttribute verwenden:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
3
SushiHangover

Ändern Sie Ihre URLs von HTTP zu HTTPS.

1
Mohsin Khan

Ich habe auch den gleichen Fehler "Klartext-HTTP-Verkehr nicht zulässig" während der Entwicklung meiner Anwendung. Ich verwende Retrofit2 für Netzwerkanrufe in meiner Anwendung und habe zwei Projektumgebungen (Entwicklung und Produktion). Meine Produktionsdomäne verfügt über ein SSL-Zertifikat mit HTTPS-Aufrufen, und Entwickler verfügen nicht über https. Die Konfiguration wird in den Build-Varianten hinzugefügt. Aber wenn ich zu dev wechsle, wird dieses Problem ausgelöst. Also habe ich die folgende Lösung hinzugefügt.

Ich habe im Manifest Klartextverkehr hinzugefügt

 Android:usesCleartextTraffic="true"

Dann habe ich eine Verbindungsspezifikation in die Nachrüstkonfigurationsklasse OKHttp Erstellungszeit eingefügt.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

Die vollständige OkHttpClient-Erstellung ist unten angegeben

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();
1
Nithinjith

Upgrade auf React Native Version 0.58.5 oder höher. Sie haben includeSubdomain in ihren Konfigurationsdateien in RN 0.58.5.

ChangeLog

In Rn 0.58.5 haben sie network_security_config mit ihrer Serverdomäne deklariert. Die Netzwerksicherheitskonfiguration ermöglicht es einer App, Klartextverkehr von einer bestimmten Domain zuzulassen. Sie müssen also keinen zusätzlichen Aufwand betreiben, indem Sie Android:usesCleartextTraffic="true" im Anwendungs-Tag Ihrer Manifest-Datei deklarieren. Es wird nach dem Upgrade der RN-Version automatisch aufgelöst.

0
Dishant Walia

Nach der geänderten API-Version 9.0 wird der Fehler "Klartext-HTTP-Verkehr zu YOUR-API.DOMAIN.COM" nicht zugelassen (targetSdkVersion = "28"). in xamarin, xamarin.Android und Android studio.

Zwei Schritte, um diesen Fehler in xamarin, xamarin.Android und Android studio zu beheben.

Schritt 1: Erstellen Sie die Datei resources/xml/network_security_config.xml

In der Datei network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Schritt 2: AndroidManifest.xml aktualisieren -

Fügen Sie Android: networkSecurityConfig = "@ xml/network_security_config" im Anwendungstag hinzu. z.B:

<application Android:label="your App Name" Android:icon="@drawable/icon" Android:networkSecurityConfig="@xml/network_security_config">
0
Ripdaman Singh

In meinem Fall funktioniert diese URL auch nicht im Browser.

Ich überprüfe mit https://www.google.com/

webView.loadUrl("https://www.google.com/")

Und es hat bei mir funktioniert.

0