DefaultHttpClient в Android 5.0 Lollipop кажется сломанным. Он не может установить соединение с некоторыми сайтами, которые были успешно установлены предыдущими версиями Android.
Например, я пытаюсь подключиться к https://uralsg.megafon.ru
//Create httpclient like in /info/61127/ssltls-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, закрытой одноранговым узлом. Конечно, это понятно, потому что 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.
Я просмотрел трафик с помощью wirehark:
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.