9

Android デバイス上の中央の信頼できるキーストアにプログラムでアクセスする方法があることを願っています。少なくとも SSL 接続などを検証するために存在することは知っています。これには、証明書の追加、ブラウジングなどのための便利なツールも付属しています ([設定] -> [場所とセキュリティ] -> [信頼できる証明書の管理] の下にあります)。

ファイルの暗号化などの目的で、公開鍵をプログラムで取得できるようにしたいと考えています。

利用可能なドキュメントを考えると、他のアプリ開発者がアプリ内で独自のキーストアを管理しているように見えますが、これは冗長に思えます。

何か案は?

4

2 に答える 2

9

これはサポートされておらず、将来のバージョンでは壊れる可能性がありますが、信頼できる証明書のリストを取得する方法は次のとおりです。/system は読み取り専用でマウントされているため、root アクセスなしで新しいものを追加することはできません。ただし、ルート アクセス権がある場合は、通常KeyStoreの API を使用して証明書を追加できます。

KeyStore ks = KeyStore.getInstance("BKS");
InputStream is = new FileInputStream("/etc/security/cacerts.bks");
ks.load(is, "changeit".toCharArray());

List<X509Certificate> certs = new ArrayList<X509Certificate>();
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
  String alias = aliases.nextElement();
  X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
  certs.add(cert);
}

編集:これは、キーストアへのパスをハードコーディングする必要がある場合に機能するはずです:

TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0];
for (X509Certificate cert : xtm.getAcceptedIssuers()) {
    String certStr = "S:" + cert.getSubjectDN().getName() + "\nI:"
                        + cert.getIssuerDN().getName();
    Log.d(TAG, certStr);
}
于 2011-08-10T02:31:29.307 に答える
3

ICS (Android 4.0 / API 14) は、まさにそれを可能にするTrustedCertificateStore (SDK では直接利用できません) を導入しました。次のように JCA キーストア API を使用してアクセスできます。

/**
 * Android Central Keystore repo usually located on /data/misc/keychain 
 * including the system trusted anchors located on /system/etc/security
 */
KeyStore keyStore = KetStore.getInstance("AndroidCAStore");
keyStore.load(null, null); //Load default system keystore
Enumeration<String> keyAliases = keyStore.aliases();

while(keyAliases.hasMoreElements()){
    String alias = keyAliases.nextElement();
    X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);

    //<User cert in whatever way you want>
}
于 2015-07-11T14:17:50.227 に答える