0

サーバーとの安全な通信を必要とする Android アプリケーションを開発しました。サーバーの証明書が Android の証明書リストに含まれていないため、信頼できないサーバーに関する例外が発生します。

次の KeyChain API (ICS 以降で利用可能) を使用して、証明書のインストールをユーザーに促します。その後、通信はシームレスに機能します。

        BufferedInputStream bis = new BufferedInputStream(getAssets().open(
                PKCS12_FILENAME));
        byte[] keychain = new byte[bis.available()];
        bis.read(keychain);

        Intent installIntent = KeyChain.createInstallIntent();
        installIntent.putExtra(KeyChain.EXTRA_PKCS12, keychain);
        installIntent.putExtra(KeyChain.EXTRA_NAME, DEFAULT_ALIAS);
        startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE);

アプリケーションの起動時に上記のコードを使用していますが、証明書が既に存在する場合でもプロンプトが表示されます。これに関して、次の 2 つの質問があります。

  1. 特定の証明書が既に存在するかどうかをプログラムで特定するにはどうすればよいですか? そのため、まだ存在しない場合にのみプロンプトを表示します。

  2. アプリケーションのインストール中に発生する、証明書のインストールをユーザーに促すために使用するイベントはありますか?

4

2 に答える 2

2

このようなものを使用して、信頼できる証明書を列挙できます。エイリアスが「user」で始まる場合、それはユーザーがインストールしたものです。ただし、これはパブリック API の一部ではないため、将来のバージョンでは機能しなくなる可能性があります。詳細はこちら: http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html

KeyStore ks = KeyStore.getInstance("AndroidCAStore");
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    X09Certificate cert = (X509Certificate) 
       ks.getCertificate(alias);
    Log.d(TAG, "Subject DN: " + 
       cert.getSubjectDN().getName());
    Log.d(TAG, "Issuer DN: " + 
       cert.getIssuerDN().getName());
}
于 2013-02-18T01:53:26.010 に答える
0

インストールされている証明書のリストをプログラムで取得することはできないように思われるため、証明書がすでにインストールされているかどうかはわかりません。信頼できないサーバーに関する例外が発生した場合は、インストールする必要があります。

また、アプリケーションのインストール中に発生するイベントはありません(このようなイベントを誰がキャッチする必要がありますか?)

于 2013-02-17T18:47:35.810 に答える