web-dev-qa-db-ja.com

Android 8:クリアテキストHTTPトラフィックは許可されていません

私は自分のアプリ(バックエンドフィードを使う)がコンテンツを表示しないとAndroid 8のユーザーからの報告を受けました。調査の結果、私は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)

(パッケージ名、URL、その他の識別子を削除しました)

Android 7以下では、ManifestでAndroid:usesCleartextTrafficを設定していません(そしてtrueに設定しても意味がありません)。ネットワークセキュリティ情報も使用しません。 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()を呼び出した場合、同じapkファイルを使用して、Android 8の場合はfalse、古いバージョンの場合はtrueが返されます。私はAndroid Oに関するGoogleの情報でこれについての言及を見つけようとしましたが、成功しませんでした。

427
david.s

ネットワークセキュリティ設定 - に従って

Android 9.0(APIレベル28)以降、クリアテキストサポートはデフォルトで無効になっています。

また見て - https://koz.io/Android-m-and-the-war-on-cleartext-traffic/

オプション1 -

ファイル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>

オプション2 -

AndroidManifest.xml -

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

また @ david.s 'answer が指摘したようにAndroid:targetSandboxVersionも問題になる可能性があります -

によると、{ Manifest Docs -

Android:targetSandboxVersion

このアプリが使用するターゲットサンドボックス。サンドボックスのバージョン番号が高いほど、セキュリティレベルが高くなります。デフォルト値は1です。 2に設定することもできます。この属性を2に設定すると、アプリは別のSELinuxサンドボックスに切り替わります。次の制限事項がレベル2サンドボックスに適用されます。

  • Network Security ConfigのusesCleartextTrafficのデフォルト値はfalseです。
  • UID共有は許可されていません。

だからオプション3 -

Android:targetSandboxVersion<manifest>がある場合は、それを1に減らします。

AndroidManifest.xml -

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

AndroidManifestでは、このパラメータを見つけました。

    Android:networkSecurityConfig="@xml/network_security_config"

@ xml/network_security_configはnetwork_security_config.xmlで次のように定義されています。

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

ちょうど私はcleartextTrafficPermittedをtrueに変更しました

56
byOnti

デバッグ時にはクリアテキストのみを許可することをお勧めしますが、プロダクションではクリアテキストを拒否することによるセキュリティ上の利点を維持します。 httpsをサポートしていない開発サーバーに対してアプリをテストしているので、これは私にとって便利です。 httpsを運用環境で強制する方法は以下のとおりですが、デバッグモードではクリアテキストを許可します。

build.gradleの場合:

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

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

AndroidManifest.xmlのアプリケーションタグ内

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

URLをHTTPからHTTPSに変更します。

それはうまくいきます!

33
eLi

誰かに役立つかもしれません。

私たちは最近Android 9でも同じ問題を抱えていましたが、WebView内にいくつかのURLを表示するだけでよく、特別なことは何もありませんでした。マニフェストにAndroid:usesCleartextTraffic="true"を追加してもうまくいきましたが、このためにアプリ全体のセキュリティを犠牲にしたくはありませんでした。そのため、修正はリンクをhttpから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>

上記の提案では、URLをhttp://xyz.abc.com/mno/のように指定していました。

私はそれを xyz.abc.com に変更し、それからそれは働き始めました。

17
Lorence

OK、つまり⇒⇒NOT NOTを何千回も繰り返してマニフェストに追加しますこれに基づいたヒント。ただし、追加のメリット(およびおそらく背景情報)を提供します。

Androidには、src-Directory用の一種の上書き機能があります。

デフォルトでは、

/ app/src /main

ただし、AndroidManifest.xmlを上書きするディレクトリを追加できます。仕組みは次のとおりです。

  • ディレクトリを作成/ app/src/debug
  • 内部でAndroidManifest.xmlを作成します

このファイル内では、すべてのルールを内部に配置する必要はありません。ただし、overwriteから好きなもののみ/app/src/main/AndroidManifest.xml

リクエストされたCLEARTEXT-Permissionの例は次のとおりです。

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

この知識があれば、あなたのdebugに応じてパーミッションをオーバーロードするのが1,2,3のように簡単になりました。メイン| release環境。

それの大きな利点...あなたはあなたのプロダクションマニフェストにデバッグスタッフを持っていません、そしてあなたはまっすぐで簡単に維持可能な構造を保ちます

15
suther

私の問題 - アンドロイド9 httpでドメインを越えたウェブビューでナビゲートしていた/ /からの解決策 - / この答え

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

そして:

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

さて、私はこれを考え出しました。これは、私たちがインスタントアプリバージョンも持っているので追加したマニフェストパラメータAndroid:targetSandboxVersion="2"によるものです - インスタントアプリから通常のアプリにユーザーが一度アップグレードすると、彼は転送でデータを失うことはありません。しかし曖昧な説明が示唆するように:

このアプリが使用するターゲットサンドボックスを指定します。サンボックスのバージョンが高いほど、セキュリティレベルが上がります。

この属性のデフォルト値は1です。

少なくともAndroid 8では、明らかに新しいレベルのセキュリティポリシーも追加されています。

7
david.s

Reactネイティブプロジェクトの場合

RN 0.59で修正済みです。 upgrade diffを0.58.6から0.59にアップグレードできます。 アップグレードしなくても適用できます。

ファイルを作成します。

Android/app/src / デバッグ / 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 / デバッグ / 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>

根本的な原因を知るために受け入れられた回答をチェックしてください。

4

URLをHTTPからHTTPSに変更します。

2
Mohsin Khan

これらのさまざまな答えをXamarin.Androidに適用するには、手動でAndroidManifest.xmlを編集するのではなく、クラスおよびアセンブリレベルの属性を使用できます。

もちろんインターネットの許可が必要です(当たり前):

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

注:通常、アセンブリレベルの属性はAssemblyInfo.csファイルに追加されますが、usingの下およびnamespaceの上の任意のファイルが機能します。

次に、Applicationサブクラス(必要に応じて作成)で、Resources/xml/ZZZZ.xmlファイルへの参照を含むNetworkSecurityConfigを追加できます。

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

Resources/xmlフォルダーにファイルを作成します(必要に応じてxmlフォルダーを作成します)。

xml/network_security_configファイルの例、必要に応じて調整します(他の回答を参照)

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

UsesCleartextTrafficApplicationAttributeパラメータを使用することもできます。

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

アプリケーションの開発中にも、同じ「クリアテキストHTTPトラフィックは許可されていません」というエラーが表示されます。アプリケーションのネットワーク呼び出しにRetrofit2を使用しており、2つのプロジェクト環境(開発および本番)があります。私の本番ドメインはHTTPS呼び出しでSSL証明書を持っているため、開発者はhttpsを持っていません。構成はビルドフレーバーに追加されます。しかし、devに変更すると、この問題が発生します。そこで、そのためのソリューションを追加しました。

マニフェストにクリアテキストトラフィックを追加しました

 Android:usesCleartextTraffic="true"

次に、レトロフィット構成クラスOKHttpの作成時に接続仕様を追加しました。

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

OkHttpClientの完全な作成を以下に示します

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

React Native 0.58.5以降のバージョンにアップグレードしてください。 RN 0.58.5の設定ファイルにはincludeSubdomainがあります。

チェンジログ

Rn 0.58.5では、彼らは自分のサーバドメインでnetwork_security_configを宣言しました。ネットワークセキュリティ設定により、アプリは特定のドメインからのクリアテキストトラフィックを許可できます。そのため、マニフェストファイルのapplicationタグにAndroid:usesCleartextTraffic="true"を宣言することで、余分な労力を費やす必要はありません。 RNバージョンをアップグレードすると自動的に解決されます。

0
Dishant Walia

APIバージョン9.0を変更した後、Your-API.DOMAIN.COMへのエラーCleartext HTTPトラフィックを取得できません(targetSdkVersion = "28")。 xamarin、xamarin.AndroidおよびAndroid studioで。

Xamarin、xamarin.AndroidおよびAndroid studioでこのエラーを解決する2つのステップ。

ステップ1:ファイルresources/xml/network_security_config.xmlを作成する

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>

ステップ2:AndroidManifest.xmlを更新する-

アプリケーションタグにAndroid:networkSecurityConfig = "@ xml/network_security_config"を追加します。例えば:

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

私の場合、そのURLはブラウザーでも機能していません。

https://www.google.com/ で確認します

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

そしてそれは私のために働いた。

0