633 votes

Android 8: trafic HTTP en clair non autorisé

J'ai eu des rapports en provenance des utilisateurs d'Android 8 que mon application (qui utilise le back-end de la nourriture) ne pas afficher le contenu. Après enquête, j'ai trouvé Exception suivante qui se passe sur Android 8:

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)

(J'ai supprimé le nom du package, les URL et autres identifiants)

Sur Android 7 et inférieur, tout fonctionne, je n'ai pas mis android:usesCleartextTraffic dans le Manifeste (et la valeur true n'aide pas, c'est la valeur par défaut de toute façon), ni puis-je utiliser le Réseau de la Sécurité de l'Information. Si je l'appelle, NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), il retourne false pour Android 8, true pour les anciennes version, en utilisant le même fichier apk. J'ai essayé de trouver quelques fait mention de cela sur Google des infos sur Android O, mais sans succès.

1365voto

Hrishikesh Kadam Points 9324

Selon le Réseau, la configuration de la sécurité -

À commencer par Android 9 (API level 28), en texte clair est désactivée par défaut.

Voir également - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Option 1 -

Créer le fichier 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:usesCleartextTraffic Doc

AndroidManifest.xml -

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

Aussi comme @david.s' répondre a souligné android:targetSandboxVersion peut être un problème trop

Selon Manifeste Docs -

android:targetSandboxVersion

La cible sandbox de l'application à utiliser. Plus le sandbox de version nombre est élevé, plus le niveau de sécurité. Sa valeur par défaut est 1; vous peut aussi le mettre à 2. La définition de cet attribut à 2 commutateurs à l'application de un autre SELinux bac à sable. Les restrictions suivantes s'appliquent à un niveau 2 sandbox:

  • La valeur par défaut de usesCleartextTraffic dans le Réseau de la Sécurité de la Config est faux.
  • Uid partage n'est pas autorisée.

Si L'Option 3 -

Si vous avez android:targetSandboxVersion en <manifest> puis le réduire à l' 1

AndroidManifest.xml -

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

74voto

byOnti Points 191

Dans le AndroidManifest, j'ai trouvé ce paramètre:

 android:networkSecurityConfig="@xml/network_security_config"
 

et @ xml / network_security_config est défini dans network_security_config.xml comme suit:

 <?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>  
 

je viens de changer cleartextTrafficPermitted à true

47voto

Tyler Points 154

Vous voudrez peut-être n'autoriser que le texte en clair lors du débogage, tout en conservant les avantages de rejeter le texte en clair en production. Cela m'est utile car je teste mon application sur un serveur de développement qui ne prend pas en charge le protocole https. Voici comment appliquer https en production, mais autoriser les cleartext en mode débogage:

Dans build.gradle:

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

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

Dans la balise d'application dans AndroidManifest.xml

 android:usesCleartextTraffic="${usesCleartextTraffic}"
 

42voto

eLi Points 558

Modifiez votre URL de HTTP à HTTPS ;

Ça marche !!!

42voto

Pablo Cegarra Points 2374

Mon problème dans Android 9 était de naviguer sur une vue Web au-dessus de domaines avec http La solution de cette réponse

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

et:

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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: