我有一个使用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
---
答案 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。