检测已安装的证书在我的Android设备(Detect installed certificate

2019-08-17 00:17发布

应用程序启动时,我在我的应用程序安装证书。 我已经经历了几下面的链接了,并成功安装证书。

  • http://nelenkov.blogspot.in/2011/12/ics-trust-store-implementation.html

  • http://pastebin.com/Bn6qSYHx

  • 如何以编程方式安装在Android的CA证书(EAP为WIFI配置)?

  • 如何在Android程序安装CA证书,而无需用户交互

我才知道,我们离不开用户静默安装证书interaction.Currently我不知道如何停止的提示,每次用户打开我的应用程序。

每当我的应用程序目前开始每次都要求用户安装证书。 有没有一些方法,我可以检测证书(在这种情况下,我的证书)是否已安装与否,编程。

在那里我有我的应用程序安装证书的代码段

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

此外仅供参考,installCertificate()从的onCreate()调用。

请帮我出的一样。 任何帮助将不胜感激。


查询:当提示来对证书名称,输入的文本来作为选择和方向改变剪切/复制选项来。 任何身体知道如何停止的文本选择时提示来?!

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


Answer 2:

添加到@ Android的回答一些额外的信息(我不能评论还),其代码只使用Android 4.0或更高版本的设备为我工作。

对于设备预冰淇淋三明治(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();
    }


Answer 3:

KeyChain.createInstallIntent,创建的目的将调用android.security.certinstaller安装证书,那么certinstaller将打印安装证书时登录。 所以你可以转储日志猫检查证书是否安装或没有。(如果用户更改证书的商店名称,你可以得到的别名)



Answer 4:

从受信任的CA存储如下阅读关闭

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

只会获取CA证书,而不是用户/客户端证书。 这是没有必要的客户端证书共享相同的别名,该CA证书。



文章来源: Detect installed certificate in my android device