2013-02-15 8 views
13

Instaluję certyfikat w mojej aplikacji po uruchomieniu aplikacji. Przeszukałem kilka linków jak poniżej i pomyślnie zainstalowałem certyfikat.Wykryj zainstalowany certyfikat na moim urządzeniu z Androidem

poznałem nie możemy zainstalować Certyfikat cicho bez interakcji użytkownika.Obecnie nie wiem, jak zatrzymać monit przy każdym otwarciu aplikacji przez użytkownika.

Zawsze, gdy moja aplikacja jest uruchamiana za każdym razem, gdy prosi użytkownika o zainstalowanie certyfikatu. Czy istnieje sposób, w jaki mogę wykryć, czy certyfikat (w tym przypadku mój certyfikat) jest już zainstalowany, czy nie, programowo.

Fragment kodu gdzie mam instalacji certyfikatu w moim app

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

także FYI, installCertificate() jest wywoływana z onCreate().

Proszę mi pomóc w tym samym. Każda pomoc zostanie doceniona.


Zapytanie: Kiedy przychodzi monit o nazwę certyfikatu, wpisany tekst jest jak wybrany i cięcia na zmiany orientacji/opcja kopia pochodzi. Każdy organ wie, jak zatrzymać zaznaczanie tekstu, gdy pojawi się monit? !!!

Odpowiedz

18

Użyłem poniżej kawałek kodu, aby sprawdzić, czy mój certyfikat jest zainstalowany lub nie

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

Używam Twojego kodu, co powinienem użyć zamiast AndroidCAStore? –

1

KeyChain.createInstallIntent, utworzony zamiar zadzwoni android.security.certinstaller zainstalować certyfikaty, wtedy certinstaller wydrukuje dziennik po zainstalowaniu certyfikatów. więc można zrzucić kota dziennika, aby sprawdzić, czy certyfikat jest zainstalowany, czy nie. (można dostać alias jeżeli użytkownik zmienił nazwę sklepu certyfikatu)

0

odczyt z zaufanego sklepu CA jak poniżej

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

pobierze tylko certyfikaty CA, a nie certyfikaty użytkownika/klienta. Nie jest konieczne, aby certyfikat klienta miał ten sam alias co certyfikat CA.

2

Dodanie dodatkowych informacji do odpowiedzi @ Androida (nie mogę jeszcze komentować), których kod działał dla mnie tylko na urządzeniach z Androidem 4.0 lub nowszym.

przypadku urządzeń wstępnej kanapka lodowa (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(); 
    } 

przypadku urządzeń z Androidem 4.0 i więcej (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

Korzystając z tej metody, poprawnie pobiera certyfikat z magazynu kluczy, nawet jeśli użytkownik nie wpisał jeszcze hasła i nazwy certyfikatu w modach otwartych przez Intent KeyStore.createInstallIntent() – Alex