CLEARTEXT communication not supported on Retrofit

后端 未结 5 1829
北荒
北荒 2020-12-05 22:34

I\'m trying to connect to https server on android using Retrofit. Here\'s my OkHttpClient

@Provides
public OkHttpClient provideContactClient(){
         


        
相关标签:
5条回答
  • 2020-12-05 23:14

    The CLEARTEXT message is due to requesting an http URL, either directly or via a server-side redirect (e.g., starts with https, then redirects to http).

    In terms of your "trust anchor for certification path not found" message, your server appears to be using some SSL certificate that is not backed by one of the standard ones on whatever Android environment you are testing on. For example, perhaps your server is using an self-signed SSL certificate.

    Options include:

    • Using network security configuration on Android 7.0+

    • Using my backport of network security configuration on Android 4.2+

    • Setting up an SSLContext that knows about your self-signed certificate, then attaching that to OkHttp, such as is illustrated by this OkHttp recipe

    0 讨论(0)
  • 2020-12-05 23:16

    usesCleartextTraffic

    use tools:replace="android:usesCleartextTraffic" in your manifest.xml file

    0 讨论(0)
  • 2020-12-05 23:24

    Also "CLEARTEXT communication not supported exception" may be easily produced even in old Android devices (6.0, 5.0, 5.1, etc.) by OkHttp library if you request an http:// host with a https/tls ConnectionSpec settings.

    0 讨论(0)
  • 2020-12-05 23:30

    According to Network security configuration

    The guidance in this section applies only to apps that target Android 8.1 (API level 27) or lower. Starting with Android 9 (API level 28), cleartext support is disabled by default.

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

    OR you can directly set in application in manifest like this.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ...>
        <uses-permission android:name="android.permission.INTERNET" />
        <application
            ...
            android:usesCleartextTraffic="true"
            ...>
            ...
        </application>
    </manifest>
    
    0 讨论(0)
  • 2020-12-05 23:31

    Adding only this to manifest (inside application)

    android:usesCleartextTraffic="true"
    

    works!

    0 讨论(0)
提交回复
热议问题