Vâng onReceiveSslError()
và handler.proceed()
nên được sử dụng khi kết nối với các dịch vụ có chứng chỉ tự ký, chế độ xem web không hòa hợp với chúng.
Suy nghĩ tôi sẽ xem ngay bây giờ là triển khai ssl phía máy chủ. Nếu bạn có nhiều dịch vụ với cùng một kiểm tra chứng nhận cho hỗ trợ SNI và nếu nó được định cấu hình tốt. Sau đó, xem liệu dịch vụ bạn đang kết nối có trả lại đúng chứng chỉ hay không. Ngoài ra, hãy kiểm tra Subject Alternative Name từ máy chủ của bạn và định cấu hình nó theo nhu cầu của bạn.
Đối với tác vụ đó, bạn có thể sử dụng các lệnh đó.
openssl s_client -showcerts -connect yourhost.com:443
openssl s_client -connect yourhost.com:443
openssl s_client -servername yourhost.com -connect yourhost.com:443
openssl s_client -connect yourhost.com:443 | openssl x509 -text
Ở đây bạn có một số thông tin nhiều hơn từ các tài liệu Android
vấn đề thường gặp với Hostname Xác Như đã đề cập ở đầu bài viết này, có hai bộ phận quan trọng để xác minh một SSL kết nối. Đầu tiên là xác minh chứng chỉ là từ nguồn tin cậy , là trọng tâm của phần trước. Trọng tâm của phần này là phần thứ hai: đảm bảo máy chủ bạn đang nói đến trình bày chứng chỉ phù hợp. Khi không, thông thường bạn sẽ thấy lỗi như sau:
java.io.IOException: Tên máy chủ 'example.com' chưa được xác minh tại libcore.net.http.HttpConnection.verifySecureSocketHostname (HttpConnection. java: 223) tại libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect (HttpsURLConnectionImpl.java:446) tại libcore.net.http.HttpEngine.sendSocketRequest (HttpEngine.java:290) tại libcore.net.http. HttpEngine.sendRequest (HttpEngine.java:240) tại libcore.net.http.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java:282) tại libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:177) tại libcore.net.http.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:271) Một lý do có thể xảy ra là do lỗi cấu hình máy chủ.Máy chủ được định cấu hình với chứng chỉ không có chủ đề hoặc các trường tên thay thế chủ đề khớp với máy chủ bạn đang cố gắng truy cập. Có thể có một chứng chỉ được sử dụng với nhiều máy chủ khác nhau. Ví dụ: xem chứng chỉ google.com.vn với openssl s_client -connect google.com:443 | openssl x509 -ext bạn có thể thấy rằng một chủ đề hỗ trợ * .google.com nhưng cũng có các tên thay thế cho * .youtube.com, * .android.com và những người khác. Lỗi xảy ra chỉ khi tên máy chủ bạn đang kết nối để không được liệt kê bởi chứng chỉ là có thể chấp nhận được.
Thật không may điều này cũng có thể xảy ra vì một lý do khác: virtual lưu trữ. Khi chia sẻ máy chủ cho nhiều hơn một tên máy chủ với HTTP, máy chủ web có thể cho biết từ yêu cầu HTTP/1.1 nhắm mục tiêu tên máy chủ mà khách hàng đang tìm kiếm. Thật không may điều này phức tạp với HTTPS, vì máy chủ phải biết chứng chỉ nào cần trả lại trước khi thấy yêu cầu HTTP. Để giải quyết vấn đề này, mới hơn phiên bản SSL, cụ thể là TLSv.1.0 trở lên, hỗ trợ Tên máy chủ Chỉ định (SNI), cho phép ứng dụng khách SSL chỉ định tên máy chủ dự định để máy chủ có thể trả lại chứng chỉ phù hợp.
May mắn thay, HttpsURLConnection hỗ trợ SNI kể từ Android 2.3. Thật không may, Apache HTTP Client không, đó là một trong nhiều lý do tại sao chúng tôi không khuyến khích sử dụng nó. Một giải pháp thay thế nếu bạn cần hỗ trợ Android 2.2 (và cũ hơn) hoặc Apache HTTP Client là thiết lập máy chủ ảo thay thế trên một cổng duy nhất sao cho nó rõ ràng chứng chỉ máy chủ nào cần trả lại.
Hy vọng điều đó sẽ hữu ích.
Nếu bạn muốn chúng tôi trợ giúp, bạn nên cung cấp thông tin thực tế thay vì sử dụng trang web của người khác như 'xyz.com' (đó là trang web thực sự). – jww
Rất tiếc, tôi đã sử dụng máy chủ lưu trữ hợp lệ. Thật không may tôi không thể tiết lộ thông tin về khách hàng và hy vọng bạn có thể hiểu điều này. – bjoernb