2014-07-04 58 views
5

Tôi gặp sự cố khi tải các trang web được bảo mật SSL bằng WebView WebView. Tôi luôn gặp lỗi như: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>Chứng chỉ WebView và SSL

Tôi đã cài đặt tất cả chứng chỉ của chuỗi chứng chỉ của máy chủ này vào keychain của Android qua Cài đặt-> Bảo mật-> Cài đặt từ thẻ SD. Tôi thậm chí có thể thấy rằng một trong các chứng chỉ được cài đặt khớp hoàn toàn với đầu ra lỗi từ LogCat. Sẽ trở nên lạ hơn nếu tôi sử dụng ứng dụng Trình duyệt mặc định: nó tải trang mà không gặp bất kỳ sự cố nào ngay cả khi tôi gỡ cài đặt tất cả các chứng chỉ được đề cập trước đây. Tôi không thực sự có bất kỳ đầu mối về cách tôi có thể sửa lỗi này mà không tin tưởng tất cả các chứng nhận bằng cách gọi handler.proceed() trong onReceivedSslError() là một vấn đề bảo mật tiềm ẩn. Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn!

Cheers Bjoern

EDIT: Các chứng chỉ gốc là tự ký vì nó chỉ nhằm mục đích được sử dụng cho các máy chủ mạng nội bộ. Tôi nghĩ rằng tất cả các chứng chỉ mà tôi thêm vào thông tin đăng nhập đáng tin cậy của Android sẽ được tin cậy.

+0

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

+0

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

Trả lời

2

Vâng onReceiveSslError()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.

Các vấn đề liên quan