我的应用程序收到 SSLHandshakeException,因为我更新了我的应用程序以使用网络安全配置。
该应用程序向两台服务器发出请求。其中之一是只能在我的公司网络中访问的开发服务器。另一个是运行 ArcGIS Server 的公共服务器。该域能够通过 TLS 1.2 进行通信。
所以,我希望一切都能正常工作,只需向我的私人开发服务器添加一条规则。这是我的网络安全配置的内容:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">172.17.1.14</domain>
</domain-config>
</network-security-config>
不幸的是,对我的公共服务器的任何请求(使用服务器制造商的第三方 API)都会导致以下异常:
Caused by: java.security.cert.CertificateException: Domain specific configurations require that hostname aware checkServerTrusted(X509Certificate[], String, String) is used
at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:111)
at com.esri.arcgisruntime.internal.e.a.a.checkServerTrusted(SourceFile:161)
at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:212)
at com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:404)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:375)
at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:224)
由于我的公共服务器有一个有效的证书并且支持 TLS 1.2,所以它不会发生,对吧?
以下网络安全配置工作正常,但不安全:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
令人上瘾的是,我读到 Facebook 的 Audience Network Android SDK 也遇到了网络安全配置问题,因为它们在 localhost 缓存文件。我已经尝试过他们提出的相同解决方案,但它也没有奏效:https ://developers.facebook.com/docs/audience-network/android-network-security-config/
我做错了什么?嗅探模拟器网络没有显示任何超出预期的请求。