Android Central Keystore - PullRequest
       25

Android Central Keystore

9 голосов
/ 10 августа 2011

Я надеюсь, что есть способ получить программный доступ к центральному надежному хранилищу ключей на устройстве Android.Я знаю, что существует, по крайней мере, для проверки SSL-соединений и т. Д., Который также поставляется с удобным инструментом для добавления сертификатов, просмотра и т. Д. (Находится в настройках-> расположение и безопасность-> управлять доверенными сертификатами)

Iхотелось бы иметь возможность программно извлекать из него открытые ключи для шифрования файлов и т. д.

Учитывая доступную документацию, кажется, что другие разработчики приложений управляют своим собственным хранилищем ключей в своем приложении, которое представляется избыточным.

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 10 августа 2011

Это не поддерживается, может сломаться в будущих версиях и т. Д., Но вот как получить список доверенных сертификатов.Вы не можете добавлять новые без корневого доступа, потому что / 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);
}
2 голосов
/ 11 июля 2015

ICS (Android 4.0 / API 14) представила TrustedCertificateStore (недоступно напрямую в SDK), который позволяет вам делать именно это. Вы можете получить к нему доступ через API JCA Keystore следующим образом:

/**
 * 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>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...