web-dev-qa-db-pt.com

Android 8: tráfego HTTP de texto não criptografado não permitido

Eu tinha relatórios de usuários com Android 8 que meu aplicativo (que usa feed de back-end) não mostra conteúdo. Após a investigação, encontrei o seguinte Exceção acontecendo no 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)

(Removi o nome do pacote, o URL e outros identificadores possíveis)

No Android 7 e inferior tudo funciona, eu não defino Android:usesCleartextTraffic no manifesto (e defini-lo como true não ajuda, que é o valor padrão de qualquer maneira), nem eu uso informações de segurança de rede. Se eu chamar NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(), ele retornará false para o Android 8, true para versões mais antigas, usando o mesmo arquivo apk. Eu tentei encontrar alguma menção a isso nas informações do Google sobre o Android O, mas sem sucesso.

427
david.s

De acordo com Configuração de segurança de rede -

A partir do Android 9.0 (nível de API 28), o suporte a texto não criptografado está desabilitado por padrão.

Também dê uma olhada em - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/

Opção 1 -

Crie o arquivo 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>

Opção 2 -

AndroidManifest.xml -

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

Também como @ david.s 'resposta assinalou Android:targetSandboxVersion pode ser um problema também -

De acordo com Manifest Docs -

Android:targetSandboxVersion

A caixa de proteção de destino para este aplicativo usar. Quanto maior o número da versão do sandbox, maior o nível de segurança. Seu valor padrão é 1; você também pode configurá-lo para 2. Configurar esse atributo como 2 alterna o aplicativo para uma caixa de proteção do SELinux diferente. As seguintes restrições se aplicam a uma caixa de proteção de nível 2:

  • O valor padrão de usesCleartextTraffic na configuração de segurança de rede é falso.
  • O compartilhamento de Uid não é permitido.

So Opção 3 -

Se você tiver Android:targetSandboxVersion in <manifest>, reduza para 1

AndroidManifest.xml -

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

No AndroidManifest, encontrei este parâmetro:

    Android:networkSecurityConfig="@xml/network_security_config"

e @ xml/network_security_config é definido em 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>  

apenas mudei o cleartextTrafficPermitted para true

56
byOnti

Você pode querer apenas permitir o texto não criptografado durante a depuração, mas mantenha os benefícios de segurança de rejeitar o texto não criptografado na produção. Isso é útil para mim porque testei meu aplicativo em um servidor de desenvolvimento que não suporta https. Veja como aplicar https na produção, mas permitir texto não criptografado no modo de depuração:

em build.gradle:

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

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

Na tag do aplicativo em AndroidManifest.xml

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

Mude seus URLs deHTTP PARA HTTPS;

Isso funciona !!!

33
eLi

Pode ser útil para alguém.

Recentemente, tivemos o mesmo problema para o Android 9, mas precisávamos exibir apenas alguns URLs no WebView, nada muito especial. Então adicionar Android:usesCleartextTraffic="true" ao Manifest funcionou, mas não queríamos comprometer a segurança de todo o aplicativo para isso. Então a correção foi na mudança de links de http para https

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

Na sugestão fornecida acima, eu estava fornecendo minha URL comohttp://xyz.abc.com/mno/

Eu mudei isso para xyz.abc.com então ele começou a funcionar.

17
Lorence

Meu problema em Android 9 estava navegando em uma visualização da Web sobre domínios com http A solução de esta resposta

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

e:

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>
15
Pablo Cegarra

Ok, isso é ⇒ NÃO ⇐⇐ os milhares repetir de adicioná-lo ao seu manifesto , mas uma dica que base nisso, mas dar-lhe benefício adicional (e talvez alguns Informação de Fundo).

O Android tem um tipo de funcionalidade de sobrescrita para o src-Directory.

Por padrão, você tem

/app/src / main

Mas você pode adicionar diretórios adicionais para sobrescrever seu AndroidManifest.xml. Aqui está como isso funciona:

  • Crie o diretório/app/src/debug
  • Dentro de criar o AndroidManifest.xml

Dentro deste arquivo, você não tem que colocar todas as regras dentro, mas somente aquelas que você gosta de sobrescrever do seu/app/src / main/AndroidManifest.xml

Aqui um exemplo como parece para a permissão de CLEARTEXT solicitada:

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

Com esse conhecimento, agora é fácil 1,2,3 sobrecarregar suas permissões, dependendo do seu debug | main | release ambiente.

O grande benefício disso ... você não tem coisas de depuração no seu Manifesto de produção e mantém uma estrutura de fácil manutenção

9
suther

Ok, eu percebi isso. É devido ao parâmetro Android:targetSandboxVersion="2" do manifesto, que eu adicionei porque também temos a versão do aplicativo instantâneo - ele deve garantir que uma vez que o usuário atualize do Instant App para o aplicativo regular, ele não perderá seus dados com a transferência. No entanto, como a descrição vaga sugere:

Especifica o sandbox de destino que este aplicativo deseja usar. Versões mais altas do sanbox terão níveis crescentes de segurança.

O valor padrão deste atributo é 1.

Obviamente, também adiciona novo nível de política de segurança, pelo menos no Android 8.

7
david.s

Para projetos de Reagir Nativos

Já estava fixado no RN 0,59. Você pode encontrar em diff de atualização de 0,58,6 para 0,59 Você pode aplicá-lo sem atualizar seu RN versão seguir os passos abaixo:

Crie arquivos:

Android/app/src / depuração / 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 a resposta aceita para saber a causa raiz.

4
Erick M. Sprengel

Altere seu URL de HTTP para HTTPS;

2
Mohsin Khan

Para aplicar essas várias respostas a Xamarin.Android, você pode usar os Atributos de nível de classe e montagem vs. editando manualmente AndroidManifest.xml

Permissão de Internet é claro que é necessário (duh ..):

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

Nota: Normalmente, os atributos de nível de montagem são adicionados ao seu arquivo AssemblyInfo.cs, mas qualquer arquivo, abaixo da using e acima da namespace, funciona.

Então, na sua subclasse Application (crie uma, se necessário), você pode adicionar NetworkSecurityConfig com uma referência a um arquivo 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();
    }
}

Crie um arquivo na pasta Resources/xml (crie a pasta xml, se necessário).

Exemplo de arquivo xml/network_security_config, ajuste conforme necessário (veja outras respostas)

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

Você também pode usar o parâmetro UsesCleartextTraffic na ApplicationAttribute:

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

Atualize para React Native 0.58.5 ou versão superior. Eles possuem includeSubdomain em seus arquivos de configuração no RN 0.58.5.

ChangeLog

Em Rn 0.58.5 eles declararam network_security_config com seu domínio de servidor. A configuração de segurança de rede permite que um aplicativo permita o tráfego de texto sem formatação de um determinado domínio. Portanto, não é necessário colocar esforço extra declarando Android:usesCleartextTraffic="true" na tag de aplicativo do seu arquivo de manifesto. Ele será resolvido automaticamente após a atualização da versão do RN.

0
Dishant Walia