2010-09-02 26 views
9

Tôi đang tạo phiên bản thử nghiệm của ứng dụng cho khách hàng. Một phần của ứng dụng này sử dụng một WebView gọi ra một trang web dựa trên SSL. Đổi lại, khách hàng đã cung cấp một miền thử nghiệm nơi tên chứng chỉ không khớp với FQDN. Than ôi, họ không ở trong một vị trí để cung cấp một cert phù hợp. :(Cảnh báo bảo mật SSL cho WebView của Android '

Tôi đang giải quyết vấn đề này trên ứng dụng quảng cáo iOS đồng hành với một dòng mã (một lần nữa, không phải để sử dụng sản xuất - chỉ cho mục đích thử nghiệm) .Tôi đã tìm kiếm thông tin tương tự trên Android OS, nhưng các giải pháp tôi đã nhìn thấy ở đây và các nơi khác là đủ để làm cho đầu tôi quay thời gian lớn bằng cách so sánh!

có cách nào đơn giản để làm việc xung quanh này? Ngay cả một diện người dùng thiết lập được giấu đi nơi nào đó?

Clues

Trả lời

6

Tạo WebViewClient và xử lý onReceivedSslError trông giống như sau:

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) 

Bên trong cuộc gọi lại này, bạn chỉ có thể gọi handler.proceed() và trang sẽ tiếp tục tải. Nếu bạn không xử lý cuộc gọi lại này và gọi phương thức proceed() thì hành vi mặc định sẽ cho trang không tải.

+1

Chú ý: Đây là nguy hiểm - nó loại bỏ tất cả các bảo mật từ SSL. Tôi biết Joe muốn đưa nó vào ứng dụng thử nghiệm của mình, điều này là tốt, nhưng cộng đồng bảo mật đã thấy nhiều trường hợp loại mã này vô tình xâm nhập vào phiên bản sản xuất, âm thầm và vô tình ảnh hưởng đến an ninh của họ. Vì vậy, nếu bạn tắt bảo mật như thế này, BE RẤT CẨN THẬN để đảm bảo rằng nó không tuyên truyền cho các phiên bản phát hành của bạn. Cảm ơn bạn đã lắng nghe thông báo dịch vụ công cộng này. –

0

Cập nhật câu trả lời theo cập nhật chính sách bảo mật mới của Google cho Trình xử lý lỗi SSL, vui lòng xem Nhà phát triển Android Help Center article này.

Để ngăn việc từ chối ứng dụng trên Google Play do vi phạm chính sách Hành vi nguy hiểm của chúng tôi.

Để xử lý xác thực chứng chỉ SSL đúng cách, hãy thay đổi mã của bạn để gọi SslErrorHandler.proceed() bất cứ khi nào chứng chỉ được 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.

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(); 

}

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