cleartextTrafficPermissed 并不像我希望的那样工作

问题描述 投票:0回答:1

我的 apk 以前可以工作,但后端开发人员做了一些更新(JWT 和 https 服务器)。但是,当我在模拟器(API 版本 34)中执行我的 Android 应用程序时,出现的错误是:

致命异常:DefaultDispatcher-worker-2 进程:com.example.labiofam_android,PID:14273 javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。 在 com.android.org.conscrypt.SSLUtils.toSSLHandshakeException(SSLUtils.java:356)...

我在 res/network_security_config.xml 中有此代码:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">127.0.0.1</domain>
    </domain-config>
</network-security-config>

在 AndroidManifest.xml 中我有这个:

android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true"

我的 API 是本地的,我确信我的服务器可以正常工作,因为我从邮递员或 swagger 发出查询,服务器也会响应。我使用的是retrofit来连接服务器,配置是下面的代码:

val baseUrl = "https://10.0.2.2:5263/api/"
    fun getInstance(): Retrofit {
        return Retrofit.Builder().baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .callFactory(OkHttpClient.Builder().callTimeout(60,TimeUnit.SECONDS).build())
            .build()

    }

我希望我的 apk 可以工作,尽管它不安全。

android kotlin security https retrofit
1个回答
0
投票

信任所有证书:既然您提到您可以接受本地开发的不安全连接,您可以创建一个信任所有证书(包括自签名证书)的 OkHttpClient。具体方法如下:

val trustAllCertificates = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustAllCertificates.init(null as KeyStore?)
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCertificates.trustManagers, SecureRandom())
val sslSocketFactory = sslContext.socketFactory

val okHttpClient = OkHttpClient.Builder()
    .sslSocketFactory(sslSocketFactory, trustAllCertificates.trustManagers[0] as X509TrustManager)
    .hostnameVerifier { _, _ -> true }
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl(baseUrl)
    .addConverterFactory(GsonConverterFactory.create())
    .client(okHttpClient)
    .build()
© www.soinside.com 2019 - 2024. All rights reserved.