15

アプリケーションの起動時にアプリケーションに証明書をインストールしています。以下のリンクのいくつかを確認し、証明書を正常にインストールしました。

ユーザーの操作なしに証明書をサイレント インストールできないことがわかりました。現在、ユーザーがアプリを開くたびにプロンプ​​トを停止する方法がわかりません。

アプリケーションが現在起動するたびに、ユーザーに証明書のインストールを要求します。証明書(この場合は私の証明書)が既にインストールされているかどうかをプログラムで検出できる方法はありますか?

アプリに証明書をインストールしたコード スニペット

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() から呼び出されます。

同じことで私を助けてください。どんな助けでも大歓迎です。


クエリ:証明書名のプロンプトが表示されると、入力されたテキストが選択されたとおりに表示され、向きを変更すると切り取り/コピー オプションが表示されます。プロンプトが表示されたときにテキスト選択を停止する方法を知っている人はいますか?!!!

4

4 に答える 4

21

以下のJavaコードを使用して、証明書がインストールされているかどうかを確認しました。

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();
}
于 2013-02-20T11:44:07.880 に答える
1

KeyChain.createInstallIntent、作成されたインテントは android.security.certinstaller を呼び出して証明書をインストールし、certinstaller は証明書がインストールされるとログを出力します。そのため、ログ cat をダンプして、証明書がインストールされているかどうかを確認できます (ユーザーが証明書のストア名を変更した場合は、エイリアスを取得できます)。

于 2013-02-23T16:33:55.947 に答える
0

以下のように、信頼できる CA ストアから読み取る

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

CA 証明書のみをフェッチし、ユーザー/クライアント証明書はフェッチしません。クライアント証明書が CA 証明書と同じエイリアスを共有する必要はありません。

于 2015-08-21T21:40:02.920 に答える