Подтвердить что ты не робот

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

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


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

4b9b3361

Ответ 1

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

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

Ответ 2

Добавление дополнительной информации в ответ @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();
    }

Ответ 3

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

Ответ 4

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

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

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