Сбой HttpClient при сбое рукопожатия в Android 5.0 Lollipop

DefaultHttpClient в Android 5.0 Lollipop, кажется, сломан. Невозможно установить соединение с некоторыми сайтами, которые были успешно установлены предыдущими версиями 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 (устройства и эмулятор) с ошибкой Соединение закрыто узлом. Конечно, это понятно, потому что Android 5.0 пытается соединить этот старый сервер с TLSv1.2 и современными шифрами, и он не поддерживает их.

Хорошо, используя пример кода вПротоколы SSL / TLS и комплекты шифров с AndroidHttpClient мы ограничиваем протокол и шифруемTLSv1 а такжеSSL_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 используя HttpClient на Android 5.0. Браузерный браузер подключает его, хотя. Android 2.3-4.4 подключает этот сайт любым способом без каких-либо затруднений.

Есть ли способ, позволяющий HttpClient подключать такие сайты? Это только один пример, я уверен, что существует множество устаревших серверов, которые не могут быть подключены через Android 5.0 и HttpClient.

Ответы на вопрос(2)

Ваш ответ на вопрос