改造2.3无法在8.0设备上找到可接受的协议

时间:2017-11-04 13:27:45

标签: android retrofit2 okhttp android-8.0-oreo

我正在努力让它在Oreo设备上运行。这适用于较旧的设备,但不适用于Oreo。 我遇到握手问题所以我添加了

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
   .tlsVersions(TlsVersion.TLS_1_2) 
   .cipherSuites(CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
   .build();

并且

   .connectionSpecs(Collections.singletonList(spec))

在客户端。 完整代码:

private static Retrofit getClient() {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
            .tlsVersions(TlsVersion.TLS_1_2)
            .cipherSuites(CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
            .build();

    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .connectionSpecs(Collections.singletonList(spec))
            .build();

    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }
    return retrofit;
}

但现在我遇到了错误

  

D / OkHttp:< - HTTP FAILED:java.net.UnknownServiceException:无法   找到可接受的协议isFallback =假,   模式= [ConnectionSpec的(密码组= [TLS_DHE_RSA_WITH_AES_256_CBC_SHA]   tlsVersions = [TLS_1_3],supportsTlsExtensions = true)],支持   protocols = [TLSv1,TLSv1.1,TLSv1.2]

     

D /错误:无法找到可接受的协议。 isFallback =假,   模式= [ConnectionSpec的(密码组= [TLS_DHE_RSA_WITH_AES_256_CBC_SHA]   tlsVersions = [TLS_1_3],supportsTlsExtensions = true)],支持   protocols = [TLSv1,TLSv1.1,TLSv1.2]

任何建议?

修改 现在我已经做到了这一点并且有效。

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            client = new OkHttpClient.Builder()
                    .addInterceptor(interceptor)
                    .build();
        }else {
            ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                    .tlsVersions(TlsVersion.TLS_1_2)
                    .cipherSuites(CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
                    .build();

            client = new OkHttpClient.Builder()
                    .addInterceptor(interceptor)
                    .connectionSpecs(Collections.singletonList(spec))
                    .build();
        }

1 个答案:

答案 0 :(得分:2)

OkHttp使用设备上启用的TLS版本与其自身连接规范的交集。对于密码套件也一样。

这里可能发生的事情是交叉点不包含您的网络服务器支持的任何内容。