2013-02-15 4 views
13

アプリケーションの起動時に証明書を自分のアプリケーションにインストールしています。私は以下のリンクのいくつかを通過し、証明書を正常にインストールします。Androidデバイスにインストールされている証明書を検出する

私たちはインストールできません知っているようになりました証明書はユーザーの介入なしに静かに表示されます。現在、ユーザーが自分のアプリを開くたびにプロンプ​​トを停止する方法はわかりません。

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

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()から呼ばれています。

同じように私を助けてください。どんな助けもありがとう。


クエリ:証明書の名前のためになるとプロンプト、選択したとして入力したテキストが来て、姿勢変化にカット/コピーのオプションが付属しています。プロンプトが表示されたら、どのようにしてテキスト選択を停止するのか知っていますか?

答えて

18

は、私は私の証明書がインストールされているかどうかを確認するためにコードの一部の下に使用されるか、または

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

私はあなたのコードを使用していますが、私はAndroidCAStoreの代わりに使用する必要がありますか? –

1

KeyChain.createInstallIntent、証明書をインストールするandroid.security.certinstallerを呼び出します作成した意図が、その後、certinstallerはログを出力しますありません証明書がインストールされているときあなたは証明書がインストールされているかどうかをチェックするために、ログの猫をダンプすることができます。以下のように、信頼できるCAストアからオフ読む

0

(ユーザーが証明書のストア名を変更した場合、あなたは、エイリアスを取得することができます)

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

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

2

Android 4.0以上のデバイスでのみコードが機能していた@ Androidの回答に(私はまだコメントできません)いくつかの追加情報を追加します。デバイスプレアイスクリームサンドイッチ(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(); 
    } 

アンドロイド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(); 
    } 
+0

このメソッドを使用すると、ユーザーがIntent KeyStore.createInstallIntent()によって開かれたモーダルにパスワードと証明書の名前をまだ入力していなくても、KeyStoreから証明書を正しく取得できます。 – Alex

関連する問題