【问题标题】:Network security configuration not working with third party API网络安全配置不适用于第三方 API
【发布时间】:2019-11-19 12:41:03
【问题描述】:

自从我更新我的应用程序以使用网络安全配置后,我的应用程序收到了 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/

我做错了什么?嗅探模拟器网络没有显示任何超出预期的请求。

【问题讨论】:

  • 找到解决方案了吗?
  • @NehaK 我没有。我怀疑 ArcGIS 平台正在通过 HTTP 进行一些重定向,但无法确定。
  • 我遇到了同样的问题,但后来我尝试使用 Glide 调用请求,因此发现 URL 错误,并将该 URL 添加到此 标记中并且它有效。可能会帮助某人..
  • URL 女巫是错误的根本原因是直接请求还是重定向?很快我将不得不再次调查这个问题,所以如果你作为答案发布,我可能可以验证并接受。
  • 没关系..如果您以后遇到任何问题,您可以尝试这种方法..

标签: android arcgis-runtime


【解决方案1】:

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

【讨论】:

  • 嗨@Plinio.Santos,你用这个解决方案解决了你的问题吗?
  • @ThinkTwiceCodeOnce 我无法验证答案,因为我不再从事该项目
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 2019-05-25
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多