2013-02-15 35 views
13

Tôi đang cài đặt chứng chỉ trong ứng dụng của mình khi ứng dụng bắt đầu. Tôi đã đi qua vài trong số các liên kết như dưới đây và cài đặt thành công chứng chỉ.Phát hiện chứng chỉ đã cài đặt trong thiết bị Android của tôi

tôi đến để biết chúng tôi không thể cài đặt chứng chỉ âm thầm mà không có sự tương tác của người dùng. Hiện tại tôi không biết cách dừng nhắc mỗi khi người dùng mở ứng dụng của tôi.

Bất cứ khi nào ứng dụng của tôi bắt đầu mỗi khi ứng dụng yêu cầu người dùng cài đặt chứng chỉ. Có cách nào tôi có thể phát hiện xem một chứng chỉ (trong trường hợp này chứng chỉ của tôi) đã được cài đặt hay chưa, theo lập trình.

đoạn mã mà tôi đã cài đặt chứng chỉ trong ứng dụng của tôi

private void installCertificate() 
    { 
     try 
     { 
      BufferedInputStream bis = new BufferedInputStream(getAssets().open(MY_CERT)); 
      byte[] keychain = new byte[bis.available()]; 
      bis.read(keychain); 

      Intent installIntent = KeyChain.createInstallIntent(); 
      X509Certificate x509 = X509Certificate.getInstance(keychain); 
      installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded()); 
      installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT); 
      startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (CertificateException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     if (requestCode == INSTALL_KEYCHAIN_CODE) 
     { 
      switch (resultCode) 
      { 
       case Activity.RESULT_OK: 
        doTheTask(); 
        break; 
       case Activity.RESULT_CANCELED: 
        finish(); 
        break;     
       default: 
        super.onActivityResult(requestCode, resultCode, data); 
      } 
     } 
    } 

Cũng FYI, installCertificate() được gọi từ onCreate().

Vui lòng giúp tôi không thay đổi. Bất kỳ trợ giúp sẽ đánh giá cao.


Query: Khi nhắc đến tên Giấy chứng nhận, văn bản đã nhập được đưa ra khi lựa chọn và trên cắt thay đổi hướng/tuỳ chọn sao chép đến. Bất kỳ cơ thể biết làm thế nào để ngăn chặn lựa chọn văn bản khi nhắc đến? !!!

Trả lời

18

tôi đã sử dụng bên dưới đoạn mã để kiểm tra xem giấy chứng nhận của tôi được cài đặt hay không

try 
     { 
      KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 
      if (ks != null) 
      { 
       ks.load(null, null); 
       Enumeration aliases = ks.aliases(); 
       while (aliases.hasMoreElements()) 
       { 
        String alias = (String) aliases.nextElement(); 
        java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 

        if (cert.getIssuerDN().getName().contains("MyCert")) 
        { 
         isCertExist = true; 
         break; 
        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (java.security.cert.CertificateException e) { 
      e.printStackTrace(); 
     } 
+0

Tôi đang sử dụng mã của bạn, tôi nên sử dụng gì thay cho AndroidCAStore? –

1

KeyChain.createInstallIntent, mục đích tạo ra sẽ gọi android.security.certinstaller để cài đặt chứng chỉ, thì certinstaller sẽ in log khi chứng chỉ được cài đặt. vì vậy bạn có thể đổ mèo log để kiểm tra xem giấy chứng nhận đã được cài đặt hay không. (bạn có thể lấy bí danh nếu người dùng đã thay đổi tên cửa hàng của giấy chứng nhận)

0

Reading khỏi cửa hàng CA tin cậy như sau

KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 

sẽ chỉ tìm nạp chứng chỉ CA chứ không phải chứng chỉ người dùng/ứng dụng khách. Không cần thiết chứng chỉ máy khách chia sẻ cùng một bí danh với bí danh của chứng chỉ CA.

2

Thêm một số thông tin bổ sung vào câu trả lời của @ Android (Tôi chưa thể nhận xét), mã của tôi chỉ hoạt động trên các thiết bị chạy Android 4.0 trở lên.

Đối với thiết bị trước IceCream Sandwich (API < 14):

boolean isCertExist; 
    TrustManagerFactory tmf; 
    try { 
     tmf = TrustManagerFactory.getInstance(TrustManagerFactory 
       .getDefaultAlgorithm()); 

     tmf.init((KeyStore) null); 

     X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0]; 
     for (X509Certificate cert : xtm.getAcceptedIssuers()) { 
      if (cert.getIssuerDN().getName().contains("MyCert")) { 
       isCertExist = true; 
       break; 
      } 
     } 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Đối với thiết bị chạy Android 4.0 trở lên (API> = 14):

boolean isCertExist; 
    try 
    { 
     KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 
     if (ks != null) 
     { 
      ks.load(null, null); 
      Enumeration aliases = ks.aliases(); 
      while (aliases.hasMoreElements()) 
      { 
       String alias = (String) aliases.nextElement(); 
       java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 

       if (cert.getIssuerDN().getName().contains("MyCert")) { 
        isCertExist = true; 
        break; 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (java.security.cert.CertificateException e) { 
     e.printStackTrace(); 
    } 
+0

Sử dụng phương pháp này tôi nhận được chứng chỉ từ KeyStore một cách chính xác, ngay cả khi người dùng chưa gõ mật khẩu và tên chứng chỉ trong các phương thức được mở bởi Intent KeyStore.createInstallIntent() – Alex

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