2013-02-15 5 views
13

Я устанавливаю сертификат в своем приложении, когда приложение запускается. Я провел несколько ссылок, как показано ниже, и успешно установил сертификат.Обнаружить установленный сертификат в моем устройстве Android

Я пришел, чтобы знать, что мы не можем установить сертификат без участия пользователя. В настоящее время я не знаю, как остановить запрос каждый раз, когда пользователь открывает мое приложение.

Всякий раз, когда мое приложение запускается в настоящее время каждый раз, когда оно просит пользователя установить сертификат. Есть ли способ определить, установлен ли сертификат (в данном случае мой сертификат) или нет, программно.

Фрагмент кода, где я установка сертификата в мое приложение

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

Также FYI, installCertificate() вызывается из OnCreate().

Пожалуйста, помогите мне за то же самое. Любая помощь будет оценена.


Запрос: Когда подсказка приходит имя сертификата, введенный текст приходит как выбрать и на разрезе изменения ориентации/опция копирования приходит. Любой орган знает, как остановить выбор текста, когда появится подсказка? !!!

ответ

18

Я использовал ниже фрагмент кода, чтобы проверить, установлен ли мой сертификат или не

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

Я использую свой код, что я должен использовать вместо AndroidCAStore? –

1

KeyChain.createInstallIntent, созданное намерение будет вызывать android.security.certinstaller для установки сертификатов, то certinstaller будет печатать журнал когда установлены сертификаты. так что вы можете сбросить кот журналу, чтобы проверить, установлен ли сертификат или нет. (Вы можете получить псевдоним, если пользователь изменил название магазина сертификата)

0

Считывание из доверенного центра сертификации, как показано ниже

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

будут получать только сертификаты ЦС, а не сертификаты пользователя/клиента. Нет необходимости, чтобы клиентский сертификат имел тот же псевдоним, что и сертификат CA.

2

Добавление дополнительной информации в ответ @ Android (я еще не могу прокомментировать), код которого работал для меня только в устройствах с Android 4.0 или выше.

для устройств предварительной 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(); 
    } 

Для устройств с Android 4.0 и выше (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

Используя этот метод, я правильно получаю сертификат из KeyStore, даже если пользователь еще не набрал пароль и имя сертификата в модалях, открытых Intent KeyStore.createInstallIntent() – Alex

Смежные вопросы