gpt4 book ai didi

android - HttpClient 在 Android 5.0 Lollipop 中失败并显示 Handshake Failed

转载 作者:可可西里 更新时间:2023-11-01 18:47:55 27 4
gpt4 key购买 nike

Android 5.0 Lollipop 中的 DefaultHttpClient 似乎已损坏。它无法设置与以前版本的 Android 成功设置的某些站点的连接。

例如,我尝试连接到 https://uralsg.megafon.ru

//Create httpclient like in https://stackoverflow.com/questions/18523784/ssl-tls-protocols-and-cipher-suites-with-the-androidhttpclient
HttpClient client = new DefaultHttpClient(manager, params);
HttpGet httpGet = new HttpGet("https://uralsg.megafon.ru");
HttpResponse client = httpclient.execute(httpGet);

此代码在 Android 2.3-4.4 中有效,但在 Android 5.0(设备和模拟器)上失败并出现错误 Connection closed by peer。当然这是可以理解的,因为 Android 5.0 尝试使用 TLSv1.2 和现代密码连接这个旧服务器,但它不支持它们。

好的,使用 SSL/TLS protocols and cipher suites with the AndroidHttpClient 中的示例代码我们将协议(protocol)和密码限制为 TLSv1SSL_RSA_WITH_RC4_128_MD5。现在它因不同的错误而失败:

javax.net.ssl.SSLHandshakeException: Handshake failed
caused by
error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac
(external/openssl/ssl/s3_pkt.c:1286 0x7f74c1ef16e0:0x00000003)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake

当然,这段代码在 Android 2.3-4.4 上运行流畅。

我用 wireshark 检查了流量:

302 4002.147873000  192.168.156.30  83.149.32.13    TLSv1   138 Client Hello
303 4002.185362000 83.149.32.13 192.168.156.30 TLSv1 133 Server Hello
304 4002.186700000 83.149.32.13 192.168.156.30 TLSv1 1244 Certificate
305 4002.186701000 83.149.32.13 192.168.156.30 TLSv1 63 Server Hello Done
307 4002.188117000 192.168.156.30 83.149.32.13 TLSv1 364 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
308 4002.240695000 83.149.32.13 192.168.156.30 TLSv1 61 Alert (Level: Fatal, Description: Bad Record MAC)

您可以看到连接已建立,但服务器发出警报,因为它可能无法解码加密的握手消息。

我没能连接到 https://uralsg.megafon.ru在 Android 5.0 上使用 HttpClient。股票浏览器确实连接了它。 Android 2.3-4.4 以任何方式连接此站点没有任何困难。

有什么方法可以让 HttpClient 连接到这些站点吗?这只是一个例子,我敢肯定还有很多遗留服务器无法通过 Android 5.0 和 HttpClient 连接。

最佳答案

更新:它被证明是后端的一个错误,而不是 android 5,尽管确实有问题的密码。

我遇到了同样的问题。对我来说,结果是密码 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 是从 android 5(更新的)默认密码集中选择的。

一旦我将它从可接受密码的客户端列表中删除,连接就会再次工作。

android 5 change log提及:

  • AES-GCM (AEAD) cipher suites are now enabled,

我很确定这是罪魁祸首。一旦服务器首选 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,连接就会失败。

请注意,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 有效。

我的猜测是 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 的 Android 实现有问题,或者您正在与之通信的服务器之一。

解决方案:

  1. 从服务器上的可用密码中删除 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(无需重新部署应用)。
  2. 从客户端提供的密码列表中删除 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(在 CLIENT_HELLO 期间)。

您可以在客户端实现您自己的 SSLSocketFactory 并调用

sslSocket.setEnabledCipherSuites(String[] suites);

关于 SSLSocket 的创建。

编辑: 请注意,这不一定是 android 错误,可能是服务器实现有问题。如果您的问题确实是由密码引起的,请在 android bug tracker 上发表评论]( https://code.google.com/p/android/issues/detail?id=81603 )。谢谢!

关于android - HttpClient 在 Android 5.0 Lollipop 中失败并显示 Handshake Failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112082/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com