网络安全配置不适用于第三方API

时间:2019-11-19 12:41:03

标签: android arcgis-runtime

自从我更新应用程序以使用网络安全配置以来,我的应用程序正在收到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也遇到了网络安全配置问题,因为它们在本地主机缓存文件。我尝试了他们提出的相同解决方案,但也没有用:https://developers.facebook.com/docs/audience-network/android-network-security-config/

我做错了什么?嗅探模拟器网络未显示任何其他预期之外的请求。

1 个答案:

答案 0 :(得分:1)

我也遇到过类似的问题。经过调查后,我在Github上发现了一个问题,其中详细说明了可能发生此问题的原因:https://github.com/microsoft/cpprestsdk/issues/1313 简而言之,这是Android框架的新行为。如果您的网络配置包含任何checkServerTrusted(X509Certificate[] certs, String authType)中调用X509TrustManager,则Framework会抛出CertificateException。因此,您应该使用X509TrustManagerExtensions并在签名中使用带有主机名的调用方法。