it-swarm.dev

Android 8 : Cleartext HTTP 트래픽이 허용되지 않음

Android 8 사용자는 백엔드 피드를 사용하는 앱에 콘텐츠가 표시되지 않는다는보고를 받았습니다. 조사한 결과 안드로이드 8에서 Exception이 발생했다.

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 및 기타 가능한 식별자를 제거했습니다)

안드로이드 7에서 모든 것이 작동하면 매니페스트에서 Android:usesCleartextTraffic를 설정하지 않습니다. true로 설정하면 도움이되지 않습니다. 그래도 기본값입니다. 네트워크 보안 정보를 사용하지 않습니다. 내가 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()을 호출하면 동일한 apk 파일을 사용하여 Android 8의 경우 false을, 이전 버전의 경우 true을 반환합니다. 나는 안드로이드 O에 관한 구글 정보에서 이것에 대한 언급을 찾아 보려고했지만 성공하지는 못했다.

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로 설정하면 앱이 다른 SELinux 샌드 박스로 전환됩니다. 레벨 2 샌드 박스에는 다음 제한 사항이 적용됩니다.

  • Network Security Config의 usesCleartextTraffic 기본값은 false입니다.
  • 사용자 공유는 허용되지 않습니다.

그래서 옵션 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
Hrishikesh Kadam

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

HTTP에서 HTTPS로 URL을 변경하십시오.

그것은 밖으로 작동합니다!

33
eLi

그것은 누군가에게 유용 할 수 있습니다.

우리는 최근에 안드로이드 9에서 동일한 문제를 겪었지만 우리는 WebView 내에 몇 가지 URL 만 표시 할 필요가있었습니다. 특별한 것은 없습니다. 그래서 Manifest에 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

좋아, 즉 ⇒⇒ NOT ⇐⇐ 수천 번 반복되는 매니페스트 에 추가하지만 이것에 기반을 둔 힌트이지만 additional Benefit (그리고 아마도 배경 정보)를 제공하십시오.

Android에는 src-Directory에 대한 일종의 덮어 쓰기 기능이 있습니다.

기본적으로

/app/src/ main

그러나 AndroidManifest.xml을 덮어 쓰는 디렉토리를 추가 할 수 있습니다. 작동 방식은 다음과 같습니다.

  • 디렉토리 생성 /app/src/debug
  • 내부에서 AndroidManifest.xml 생성

이 파일 내에서, 당신은 do n't 모든 규칙들을 안에 넣어야하지만, 당신이 좋아하는 규칙들만 overwrite from /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 | main | release 환경에 따라 권한을 오버로드하는 것이 1,2,3만큼 쉬워졌습니다.

그것에 큰 이점은 ... 당신은 당신의 프로덕션 매니 페스트에 디버그 물건이 없으며 똑바로 쉽고 유지 보수가 쉬운 구조를 유지

15
suther

내 문제는 안드로이드 9 는 http로 도메인을 통해 webview에서 탐색했습니다 이 답변

<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

좋아, 내가 알아 냈어. Instant App 버전을 가지고 있기 때문에 Manifest 매개 변수 Android:targetSandboxVersion="2"로 인해 추가되었습니다. 사용자가 Instant App에서 일반 앱으로 업그레이드 한 후에야 전송할 데이터가 손실되지 않습니다. 그러나 애매한 묘사가 암시하는 것처럼 :

이 앱에서 사용하려는 대상 샌드 박스를 지정합니다. Sanbox 버전이 높을수록 보안 수준이 높아집니다.

이 속성의 기본값은 1입니다.

적어도 안드로이드 8에서는 새로운 수준의 보안 정책이 추가되었습니다.

7
david.s

네이티브 프로젝트에 대한 반응

이미 RN 0.59에서 수정되었습니다. 0.58.6에서 0.59로 upgrade diff를 찾을 수 있습니다 RN 버전을 업그레이드하지 않고 적용 할 수 있습니다. 아래 단계를 따르십시오.

파일 만들기 :

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

수락 된 답변을 확인하여 근본 원인을 확인하십시오.

4
Erick M. Sprengel

URL을 HTTP에서 HTTPS로 변경하십시오.

2
Mohsin Khan

이러한 다양한 대답을 Xamarin.Android에 적용하려면 클래스 및 어셈블리 수준 특성을 사용하는 대신 AndroidManifest.xml를 수동으로 편집하십시오

물론 인터넷 허가가 필요합니다 (duh ..) :

[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

내 응용 프로그램을 개발하는 동안 동일한 "Cleartext HTTP traffic not allowed"오류가 표시됩니다. 내 응용 프로그램에서 네트워크 호출에 Retrofit2를 사용하고 있으며 두 가지 프로젝트 환경 (dev & production)이 있습니다. 내 프로덕션 도메인에 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에 대한 일반 텍스트 HTTP 트래픽이 허용되지 않습니다 (targetSdkVersion = "28"). xamarin, xamarin.Android 및 Android 스튜디오에서.

Xamarin, xamarin.Android 및 Android studio에서이 오류를 해결하기위한 두 단계.

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