2016-02-17 27 views
21

Trong một trong các ứng dụng của tôi, tôi đang sử dụng HTTPS với chứng chỉ tự ký và theo mã mẫu từ trang web đào tạo dành cho nhà phát triển Android (https://developer.android.com/training/articles/security-ssl.html#UnknownCa).Cảnh báo bảo mật của Google Play cho TrustManager

Gần đây tôi nhận được cảnh báo sau đây nói rằng việc thực hiện hiện tại không được bảo đảm:

an ninh cảnh báo

ứng dụng bạn đang sử dụng một thực hiện không an toàn của giao diện X509TrustManager với một ứng dụng Apache HTTP , dẫn đến lỗ hổng bảo mật . Vui lòng xem this Google Help Center article để biết chi tiết , bao gồm thời hạn để sửa lỗ hổng bảo mật.

Ai đó có thể cung cấp thêm chi tiết về nội dung cần được cập nhật ngoài mã mẫu được liên kết ở trên không?

Tôi có nên triển khai TrustManager tùy chỉnh không? Nếu vậy, nó nên xác minh điều gì?

+1

Um, mà dường như được đề cập trong [bài viết Trung tâm Trợ giúp của Google] (https://support.google.com/faqs/answer/6346016): "Để xử lý đúng đắn SSL xác nhận chứng chỉ, thay đổi mã của bạn trong phương thức checkServerTrusted của giao diện X509TrustManager tùy chỉnh của bạn để tăng CertificateException hoặc IllegalArgumentException bất cứ khi nào chứng chỉ được trình bày bởi máy chủ không đáp ứng được mong đợi của bạn. " Làm thế nào chính xác là bạn thiết lập 'TrustManager' của bạn? Bạn sử dụng nó như thế nào? – CommonsWare

+0

@CommonsChính xác như trong mã mẫu https://developer.android.com/training/articles/security-ssl.html#UnknownCa Tôi có nên làm gì khác không? – Muzikant

+0

Không có mã cho kịch bản chứng chỉ máy chủ tự ký trên trang mà bạn đã liên kết đến. Có mã cho trường hợp chứng chỉ-chứng chỉ không xác định. – CommonsWare

Trả lời

3

Đối với tôi, vấn đề là Mobilecore. Tôi đã xóa thư viện khỏi ứng dụng và tải lên phiên bản mới của gói ứng dụng và cảnh báo đã biến mất khỏi Bảng điều khiển dành cho nhà phát triển GPlay.

14

Cố gắng tìm kiếm "TrustManager" trong mã của bạn, nếu không tìm thấy mã nào, hầu hết các trường hợp do thư viện của bên thứ ba được bao gồm.

Đối với tôi, đó là vì sử dụng phiên bản ACRA cũ hơn (https://github.com/ACRA/acra).

+0

Như đã đề cập trong các nhận xét cho câu hỏi, đây là trường hợp tương tự với thư viện bên thứ 3 khác nhau – Muzikant

+1

Có cách nào chúng ta có thể nắm bắt vấn đề này trong quá trình biên dịch như sử dụng Lint hay bất kỳ công cụ phân tích tĩnh nào hay không . – Pavan

+0

Về ACRA, hãy xem https://github.com/ACRA/acra/issues/374 – mhsmith

1

Tôi cũng đã xác định rằng ARCA 4.3 dường như có khả năng là thủ phạm cho ứng dụng của tôi.

Câu hỏi, có ai biết để xác minh rằng vấn đề được giải quyết không? Hiện tại, cửa hàng Play mà tôi có quyền truy cập không khiến Google đưa ra cảnh báo cho tôi, nhưng một trong những đối tác của chúng tôi đã xuất bản ứng dụng đã nhận được cảnh báo. Tôi muốn xác minh rằng vấn đề đã được giải quyết trước khi cung cấp cho đối tác của chúng tôi APK mới.

2

Có thể đến trễ, nhưng hy vọng nó có thể giúp ai đó, hãy gọi phương thức này trước khi yêu cầu đến máy chủ. Nếu chứng chỉ không tin cậy, bạn có hộp thoại thực hiện hoặc một cái gì đó để người dùng có thể quyết định, ở đây tôi sử dụng hộp thoại cảnh báo.

public static void trustSSLCertificate(final Activity mActivity, final DownloadPortalTask task){ 
 
     try { 
 
      HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
 
       public boolean verify(String hostname, SSLSession session) { 
 
        return true; 
 
       } 
 
      }); 
 

 
      SSLContext context = SSLContext.getInstance("TLS"); 
 
      context.init(null, new X509TrustManager[]{new X509TrustManager() { 
 
       public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
 
       } 
 

 
       public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
 
        try { 
 
         chain[0].checkValidity(); 
 
        } catch (final Exception e) { 
 

 
         mActivity.runOnUiThread(new Runnable() { 
 
          @Override 
 
          public void run() { 
 
           AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 
 
           AlertDialog alertDialog = builder.create(); 
 
           alertDialog.setCancelable(false); 
 
           String message = "There a problem with the security certificate for this web site."; 
 
           message += "\nDo you want to continue anyway?"; 
 
           alertDialog.setTitle("SSL Certificate Error"); 
 
           alertDialog.setMessage(message); 
 
           alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { 
 
            @Override 
 
            public void onClick(DialogInterface dialog, int which) { 
 
             acceptSSL = true; 
 
             return; 
 

 
            } 
 
           }); 
 

 
           alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 
 
            @Override 
 
            public void onClick(DialogInterface dialog, int which) { 
 
             acceptSSL = true; 
 
             task.onInterruptedDownload(); 
 
            } 
 
           }); 
 
           alertDialog.show(); 
 

 
          } 
 

 
         }); 
 

 
         while(!acceptSSL){ 
 
          try{ 
 
           Thread.sleep(1000); 
 
          } catch(InterruptedException er) { } 
 
         } 
 

 
        } 
 
       } 
 
       public X509Certificate[] getAcceptedIssuers() { 
 
        return new X509Certificate[0]; 
 
       } 
 
      }}, new SecureRandom()); 
 
      HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); 
 
     } catch (Exception e) { // should never happen 
 
      e.printStackTrace(); 
 
     } 
 
    }

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