似乎在 Google Play 服务更新之后,使用 ION 进行 HTTPS 请求的 Android 应用程序失败

Posted

技术标签:

【中文标题】似乎在 Google Play 服务更新之后,使用 ION 进行 HTTPS 请求的 Android 应用程序失败【英文标题】:Android app using ION for HTTPS requests fail, seemingly after Google Play Services update 【发布时间】:2017-11-02 14:49:53 【问题描述】:

我有一个 android 应用程序使用 ION 向我的后端发出 HTTPS 请求。今天早上,它突然开始因 SSL 握手错误而失败:

javax.net.ssl.SSLHandshakeException: error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE

这几乎是日志中唯一的信息。

这首先发生在一部手机上,然后是另一部,然后是另一部,没有任何更改推送到手机应用程序或后端。这似乎与 Google Play 服务的更新有关。这些手机同时运行 Marshmallow 和 Nougat。

并非所有服务器都失败,它似乎与我在 AWS 上使用 API 网关/Cloudfront 的服务器有关。使用相同的证书直接访问我的 EC2 服务器可以正常工作。

使用openssl 我得到以下输出:

$ openssl s_client -connect <my-server>:443
CONNECTED(00000003)
SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:770:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 295 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

【问题讨论】:

【参考方案1】:

在找到this AWS forum thread 之后,我怀疑SNI 可能是问题所在,这导致我找到this Stack Overflow question,其中包含一个修复程序,包括禁用ION 的Conscrypt MW:

mIon.getConscryptMiddleware().enable(false);

只需将其放在您的Application 子类或配置 Ion 的任何其他位置。如果您不使用专用的 Ion 实例,您可以在 Ion.getDefault() 上调用它。

我不完全了解此更改的后果,但它确实解决了我的问题。请注意,链接的问题提到,一旦更新了 Google Play 服务,就不需要这样做,但在我的情况下,似乎是 GPS 的更新触发了此更改的需要。非常欢迎任何能够了解为什么这有效以及它的作用的任何人都可以为这个答案做出贡献。

【讨论】:

【参考方案2】:

我不完全了解此更改的后果

我只能对此发表评论,我不熟悉您项目的其他细节。

通常您会发现旧客户端/运行时不支持SNI,因为它是一种更现代的技术,我认为它是随 TLS 引入的。例如,我相信 Python 2.6 不支持 SNI。

大多数现代客户端/运行时都支持 SNI,并且与 API GW 通信没有问题。在这种情况下,TLS 握手将在 CloudFront 终止,默认情况下要求客户端使用 SNI。

【讨论】:

以上是关于似乎在 Google Play 服务更新之后,使用 ION 进行 HTTPS 请求的 Android 应用程序失败的主要内容,如果未能解决你的问题,请参考以下文章

Android Google Play 订阅不自动更新

使用Google Play服务位置API来监听位置服务更新

使用 google play 服务和 FusedLocationProviderClient 进行位置更新

Google play是啥意思

在模拟器中更新 Google Play 服务

怎么下载谷歌play