Обнаружить установленный сертификат в моем устройстве 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 ().

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


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

Solutions Collecting From Web of "Обнаружить установленный сертификат в моем устройстве Android"

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

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

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

Для устройств pre 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(); } 

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

Чтение из доверенного хранилища CA, как показано ниже

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

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