我的 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 可以工作,尽管它不安全。
信任所有证书:既然您提到您可以接受本地开发的不安全连接,您可以创建一个信任所有证书(包括自签名证书)的 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()