Mặc địnhHttpClient trong Android 5.0 Lollipop dường như bị hỏng. Nó không thể thiết lập kết nối đến một số trang web đã được thiết lập thành công bởi các phiên bản trước của Android.HttpClient thất bại với Handshake Không thành công trong Android 5.0 Lollipop
Ví dụ tôi cố gắng để kết nối với 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);
Mã này hoạt động trong Android 2,3-4,4, nhưng không thành công trên Android 5.0 (thiết bị và giả lập) với kết nối lỗi đóng by peer. Tất nhiên điều này là dễ hiểu vì Android 5.0 cố gắng kết nối máy chủ cũ này với TLSv1.2 và mật mã hiện đại và nó không hỗ trợ chúng.
Ok, sử dụng mã mẫu trong SSL/TLS protocols and cipher suites with the AndroidHttpClient chúng tôi giới hạn các giao thức và mật mã để TLSv1 và SSL_RSA_WITH_RC4_128_MD5. Bây giờ nó không thành công với một lỗi khác:
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
Và tất nhiên mã này chạy trơn tru trên Android 2.3-4.4.
Tôi đã kiểm tra giao thông với 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)
Bạn có thể thấy mối quan hệ đó được thành lập nhưng máy chủ báo vì nó có lẽ không thể giải mã thông điệp bắt tay được mã hóa.
Tôi không quản lý kết nối với https://uralsg.megafon.ru bằng cách sử dụng HttpClient trên Android 5.0. Trình duyệt cổ phiếu không kết nối nó mặc dù. Android 2.3-4.4 kết nối trang web này theo bất kỳ cách nào mà không gặp bất kỳ khó khăn nào.
Có cách nào để làm cho HttpClient có thể kết nối các trang web đó không? Đây chỉ là một ví dụ, tôi chắc chắn có rất nhiều máy chủ kế thừa không thể kết nối được với Android 5.0 và HttpClient.
Tôi gặp vấn đề tương tự với điều này. Nếu tôi biết giải pháp, tôi sẽ thêm ý kiến. Nó thực sự khó chịu – cmcromance