2013-03-23 33 views
15

Tôi đã thử nhiều ngày để sử dụng chế độ xem web có chứng chỉ ứng dụng được nhúng trong ứng dụng, nhưng dường như với tôi rằng sdk android không cung cấp bất kỳ cách nào để thực hiện, có một cuộc gọi lại để chặn thách thức được gửi bởi máy chủ? có cách nào để sử dụng chế độ xem web với chứng chỉ ứng dụng khách và thực hiện yêu cầu https không?android webview với chứng chỉ ứng dụng khách

Trả lời

46

Vì tôi quan tâm đến vấn đề của bạn, tôi đã kiểm tra tài liệu cho WebView và WebViewClient, lướt qua và thực sự có vẻ như bạn không thể xác thực phiên webview bằng chứng chỉ ứng dụng khách, làm phương thức được yêu cầu (ClientCertRequestHandler)) không phải là API công khai.

Using a Android WebView to connect to secure server with Client Certificate

Tìm kiếm trong Thảo luận Android an ninh khẳng định rằng các cuộc gọi thực sự là không có sẵn:

https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J

và mặc dù

Việc phát hành Android 4.0 không bao gồm hỗ trợ để xác thực chứng chỉ ứng dụng khách trong trình duyệt.

(ref: https://code.google.com/p/android/issues/detail?id=8196)

không đề cập đến khoảng WebViews được làm :(

Mặc dù có một số API mới để tải các chứng chỉ trong một Keychain:

http://developer.android.com/reference/android/security/KeyChain.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html

không rõ liệu WebView có sử dụng chúng hay không ... Vì vậy, tôi đoán bạn nên thử lớp KeyChain một nd xem nếu bạn có thể xác thực một cách chính xác (tôi không có cách đơn giản để kiểm tra này, vì vậy bạn đang ở trên của riêng bạn).

Nếu Keychain không làm việc với WebViews, tôi đoán nó tất cả nắm để một vài xa cách giải quyết hoàn hảo:

Giải pháp 1:

sử dụng ClientCertRequestHandler anyway (Nó đánh dấu là ẩn, nhưng dường như vẫn còn sử dụng):

https://code.google.com/p/android/issues/detail?id=53491

t Tuy nhiên thậm chí giả chiếc mũ bạn tạo ra, Android Dev. Nhóm có thể sửa đổi/xóa phương thức mà không cần thông báo và ứng dụng của bạn có thể ngừng hoạt động trên các bản phát hành tương lai của SO.

Giải pháp 2:

Nếu bạn có thể giới hạn mục tiêu của bạn lên Android 4.0 hoặc mới hơn, một đậm (và không ...) Giải pháp là để cố gắng tải các chứng chỉ trong webview từ lưu trữ tại địa phương sử dụng một chương trình tập tin:

Load local HTML file into WebView

nhưng tôi mạnh mẽ nghi ngờ rằng webview sẽ cư xử như trình duyệt không ...

Giải pháp 3: (mà nên làm việc nhưng đòi hỏi rất nhiều nỗ lực)

Xử lý mỗi https kết nối ở chế độ nền sử dụng HttpClient hoặc HttpURLConnection và sau đó vượt qua các dữ liệu vào WebView:

http://chariotsolutions.com/blog/post/https-with-client-certificates-on/

Bạn có sự thông cảm của tôi.

+2

1 cho rất (rất) cũng ghi nhận câu trả lời – Askolein

+0

@Alvin nhờ để cập nhật các liên kết! :) – Rick77

2

WebView dựa trên Chronium trên Android 4.4 đã giới thiệu lỗi: Khi máy chủ yêu cầu chứng chỉ ứng dụng khách, WebView sẽ ngừng quá trình tải. onPageFinished -Mục đích sẽ được gọi ngay lập tức, nhưng không có trang nào được hiển thị.

->https://code.google.com/p/android/issues/detail?id=62533

5

Trong API 21 (Android Lollipop) và cao hơn bạn có thể ghi đè lên WebViewClient.onReceivedClientCertRequest (xem WebView, ClientCertRequest yêu cầu) . Trong phương thức này, hãy sử dụng trình quản lý khóa của bạn để nhận khóa cá nhân và chuỗi chứng chỉ và gọi tới số request.proceed().

9

Nếu bạn chỉ cần bỏ qua yêu cầu chứng chỉ ssl bên trong xem web, điều này làm việc cho tôi trên Lollipop:

Bên trong cái nhìn của khách hàng web của bạn, ghi đè lên:

@Override 
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
    handler.proceed(); // Ignore SSL certificate errors 
} 

này rất hữu ích để gỡ lỗi WebViews chống lại các môi trường qa/dev/stage.

+1

#refreshing. Sử dụng đoạn mã này, ứng dụng của bạn có cơ hội lớn để bị từ chối xác nhận ứng dụng google. Nó đã xảy ra với tôi. Vui lòng xem http://stackoverflow.com/questions/35720753/android-google-play-warning-ssl-error-handler-vulnerability –

+1

Đây không phải là "một cơ hội lớn để bị từ chối", Cửa hàng Play phát hiện tự động bỏ qua này và từ chối không có cơ hội :) – StevenTB

+1

Ứng dụng của tôi đã bị từ chối hôm qua vì mã này. Tôi sẽ không sử dụng cái này nữa. – Nickmccomb

3

Để xử lý xác thực chứng chỉ SSL đúng cách để ngăn ứng dụng từ chối phát Google theo Chính sách bảo mật được cập nhật, hãy thay đổi mã của bạn để gọi SslErrorHandler.proceed() bất cứ khi nào chứng chỉ trình bày bởi máy chủ đáp ứng mong đợi của bạn và gọi SslErrorHandler.cancel() nếu không thì.

Ví dụ: tôi thêm hộp thoại cảnh báo để làm cho người dùng đã xác nhận và dường như Google không còn hiển thị cảnh báo nữa.

@Override 
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    String message = "SSL Certificate error."; 
     switch (error.getPrimaryError()) { 
      case SslError.SSL_UNTRUSTED: 
       message = "The certificate authority is not trusted."; 
       break; 
      case SslError.SSL_EXPIRED: 
       message = "The certificate has expired."; 
       break; 
      case SslError.SSL_IDMISMATCH: 
       message = "The certificate Hostname mismatch."; 
       break; 
      case SslError.SSL_NOTYETVALID: 
       message = "The certificate is not yet valid."; 
       break; 
     } 
     message += " Do you want to continue anyway?"; 

     builder.setTitle("SSL Certificate Error"); 
     builder.setMessage(message); 
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      handler.proceed(); 
     } 
    }); 
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      handler.cancel(); 
     } 
    }); 
    final AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 

Sau khi thay đổi này sẽ không hiển thị cảnh báo.

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