在我的Android设备中检测已安装的证书

时间:2013-02-15 06:20:46

标签: android certificate

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

我发现我们无法在没有用户交互的情况下安静地安装证书。目前我不知道每次用户打开我的应用程序时如何停止提示。

每当我的应用程序每次都要求用户安装证书时,它就会启动。有没有办法可以通过编程方式检测证书(在这种情况下是我的证书)是否已经安装。

我在我的应用中安装证书的代码段

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,从onCreate()调用installCertificate()。

请帮帮我。任何帮助将不胜感激。


查询:当出现证书名称提示时,输入的文本将显示为已选中且方向更改剪切/复制选项出现。当提示到来时,任何机构都知道如何停止文本选择?!!!

3 个答案:

答案 0 :(得分:20)

我使用下面的代码来检查我的证书是否已安装

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

答案 1 :(得分:1)

KeyChain.createInstallIntent,创建的intent将调用android.security.certinstaller来安装证书,然后certinstaller将在安装证书时打印日志。所以你可以转储日志cat以检查是否安装了证书。(如果用户更改了证书的商店名称,你可以获得别名)

答案 2 :(得分:0)

从受信任的CA商店中读取

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

只会获取CA证书而不是用户/客户端证书。客户端证书不必共享与CA证书相同的别名。