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

时间:2017-06-01 12:39:12

标签: android ssl aws-api-gateway sslhandshakeexception ion

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

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

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

这首先发生在一部手机上,然后发生在另一部手机上,而另一部手机则没有任何变化,也没有推送到手机应用程序和后端。这似乎与Google Play服务的更新有关。手机正在运行Marshmallow和Nougat。

它不会因所有服务器而失败,它似乎与使用API​​网关/ Cloudfront的AWS上的服务器相关。使用相同的证书直接访问我的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
---

2 个答案:

答案 0 :(得分:2)

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

mIon.getConscryptMiddleware().enable(false);

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

我并不完全了解这种变化的后果,但它确实解决了我的问题。请注意,链接的问题提到,一旦Google Play服务更新,就不需要这样做,但在我的情况下,似乎GPS的更新是触发 need 进行此更改的原因。任何能够阐明为什

答案 1 :(得分:1)

  

我并不完全了解这一变化的后果

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

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

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