tesis tag studio sobre log investigacion example caracteristicas android http https

tag - Android 8: no se permite el tráfico HTTP de texto sin cifrar



tag in android (16)

Recibí informes de usuarios con Android 8 de que mi aplicación (que usa alimentación de fondo) no muestra contenido. Después de la investigación, encontré la siguiente excepción en 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)

(He eliminado el nombre del paquete, la URL y otros identificadores posibles)

En Android 7 y android:usesCleartextTraffic , todo funciona, no configuro android:usesCleartextTraffic in Manifest (y establecerlo en true no ayuda, ese es el valor predeterminado de todos modos), ni uso la información de seguridad de red. Si llamo a NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() , devuelve false para Android 8, true para la versión anterior, usando el mismo archivo apk. Traté de encontrar alguna mención de esto en la información de Google sobre Android O, pero sin éxito.


Actualice a React Native 0.58.5 o una versión superior. Tienen includeSubdomain en sus archivos de configuración en RN 0.58.5.

ChangeLog

En Rn 0.58.5 han declarado network_security_config con su dominio de servidor. La configuración de seguridad de red permite que una aplicación permita el tráfico de texto sin formato de un determinado dominio. Por lo tanto, no es necesario hacer un esfuerzo adicional declarando android:usesCleartextTraffic="true" en la etiqueta de la aplicación de su archivo de manifiesto. Se resolverá automáticamente después de actualizar la versión RN.


Cambia tus URL de HTTP a HTTPS ;

¡¡¡Funciona!!!


De acuerdo, he resuelto esto. Se debe al parámetro Manifiesto android:targetSandboxVersion="2" , que he agregado porque también tenemos la versión de la aplicación instantánea: debe asegurarse de que una vez que el usuario actualice de la aplicación instantánea a la aplicación normal, no perderá sus datos con el transferir. Sin embargo, como sugiere la vaga descripción:

Especifica el entorno limitado de destino que esta aplicación quiere usar. Las versiones superiores de sanbox tendrán niveles crecientes de seguridad.

El valor predeterminado de este atributo es 1.

Obviamente, también agrega un nuevo nivel de política de seguridad, al menos en Android 8.


Después de cambiar la versión 9.0 de la API, aparece el error. El tráfico HTTP de texto claro a YOUR-API.DOMAIN.COM no está permitido (targetSdkVersion = "28"). en xamarin, xamarin.android y android studio.

Dos pasos para resolver este error en xamarin, xamarin.android y android studio.

Paso 1: Crear recursos de archivo / xml / network_security_config.xml

En network_security_config.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>

Paso 2: actualice AndroidManifest.xml -

Agregue android: networkSecurityConfig = "@ xml / network_security_config" en la etiqueta de la aplicación. p.ej:

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


En el AndroidManifest encontré este parámetro:

android:networkSecurityConfig="@xml/network_security_config"

y @ xml / network_security_config se define en network_security_config.xml como:

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

acabo de cambiar cleartextTrafficPermitted a true


En mi caso, esa URL no funciona en el navegador también.

Lo verifico con https://www.google.com/

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

Y funcionó para mí.


Es posible que solo desee permitir texto sin cifrar durante la depuración, pero mantenga los beneficios de seguridad de rechazar el texto sin formato en la producción. Esto es útil para mí porque pruebo mi aplicación en un servidor de desarrollo que no admite https. Aquí se explica cómo aplicar https en producción, pero permitir texto sin formato en modo de depuración:

En build.gradle:

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

En la etiqueta de la aplicación en AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"


Mi problema en Android 9 era navegar en una vista web sobre dominios con http La solución de esta respuesta

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

y:

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>


Ok, eso es ⇒⇒ NO ⇐⇐ la repetición de miles de agregarlo a su Manifiesto , pero una pista que se basa en esto, pero le da un beneficio adicional (y tal vez algo de información de fondo).

Android tiene un tipo de funcionalidad de sobrescritura para el directorio src.

Por defecto, tienes

/ app / src / main

Pero puede agregar directorios adicionales para sobrescribir su AndroidManifest.xml. Así es como funciona:

  • Cree el directorio / app / src / debug
  • Dentro de crear el AndroidManifest.xml

Dentro de este archivo, no tiene que poner todas las Reglas dentro, sino solo las que desea sobrescribir desde su / app / src / main / AndroidManifest.xml

Aquí un ejemplo de cómo se ve para el permiso CLEARTEXT solicitado:

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

Con este conocimiento, ahora es tan fácil como 1,2,3 sobrecargar sus permisos dependiendo de su depuración | principal | liberar el medio ambiente.

El gran beneficio es que ... no tiene elementos de depuración en su Manifiesto de producción y mantiene una estructura recta y fácil de mantener


Para aplicar estas diversas respuestas a Xamarin.Android , puede usar los atributos de nivel de clase y ensamblado en lugar de editar manualmente AndroidManifest.xml

Por supuesto, se necesita permiso de Internet (duh ..):

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

Nota: Por lo general, los atributos de nivel de ensamblado se agregan a su archivo AssemblyInfo.cs , pero cualquier archivo, debajo del using y sobre el namespace funciona.

Luego, en su subclase de aplicación (cree una si es necesario), puede agregar NetworkSecurityConfig con una referencia a un archivo Resources/xml/ZZZZ.xml :

#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(); } }

Cree un archivo en la carpeta Resources/xml (cree la carpeta xml si es necesario).

Ejemplo de archivo xml/network_security_config , ajústelo según sea necesario (vea otras respuestas)

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

También puede usar el parámetro UsesCleartextTraffic en ApplicationAttribute :

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


Podría ser útil para alguien.

Recientemente tuvimos el mismo problema con Android 9, pero solo necesitábamos mostrar algunas URL en WebView, nada muy especial. Por lo tanto, agregar android:usesCleartextTraffic="true" a Manifest funcionó, pero no queríamos comprometer la seguridad de toda la aplicación para esto. Entonces, la solución fue cambiar los enlaces de http a https


Según la configuración de seguridad de la red :

A partir de Android 9 (API nivel 28), la compatibilidad con texto sin formato está deshabilitada de forma predeterminada.

También eche un vistazo a: https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Opción 1 -

Crear archivo 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>

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

También como la respuesta de @ david.s señaló android:targetSandboxVersion puede ser un problema:

De acuerdo con los documentos manifiestos :

android:targetSandboxVersion

El entorno limitado de destino para que esta aplicación lo use. Cuanto mayor sea el número de versión de sandbox, mayor será el nivel de seguridad. Su valor predeterminado es 1; también puede establecerlo en 2. Establecer este atributo en 2 cambia la aplicación a un entorno limitado de SELinux diferente. Las siguientes restricciones se aplican a un entorno limitado de nivel 2:

  • El valor predeterminado de usesCleartextTraffic en la configuración de seguridad de red es falso.
  • No se permite compartir UID.

Entonces la Opción 3 -

Si tiene android:targetSandboxVersion en <manifest> , reduzca a 1

AndroidManifest.xml -

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


También recibo el mismo error "No se permite el tráfico HTTP de texto en claro" al desarrollar mi aplicación. Estoy usando Retrofit2 para llamadas de red en mi aplicación y tengo dos entornos de proyecto (desarrollo y producción). Mi dominio de producción tiene un certificado SSL con llamadas HTTPS y el desarrollador no tendrá https. La configuración se agrega en los sabores de compilación. Pero cuando cambio a dev, este problema se disparará. Así que agregué la siguiente solución para eso.

He agregado tráfico de texto sin formato en el manifiesto

android:usesCleartextTraffic="true"

Luego, agregué una especificación de conexión en el tiempo de creación de la clase de configuración de actualización OKHttp.

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

La creación completa de OkHttpClient se da a continuación

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();


agregar estos parámetros en el encabezado resolvió mi problema en apiSauce

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


Para proyectos React Native

Ya estaba arreglado en RN 0.59. Puede encontrar en la actualización diff de 0.58.6 a 0.59 . Puede aplicarlo sin actualizar su versión RN. Siga los pasos a continuación:

Crea archivos:

android / app / src / debug /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>

Verifique la respuesta aceptada para conocer la causa raíz.


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

En la sugerencia proporcionada anteriormente, estaba proporcionando mi URL como http://xyz.abc.com/mno/

Cambié eso a xyz.abc.com y luego comenzó a funcionar.